Makefile的一个具体的实例

来源:http://blog.sina.com.cn/s/blog_73d4d5fa0100paiy.html

(2011-03-06 23:10:02)

标签:

linux.makefile

杂谈

分类: Linux系统管理

工程中的代码分别存放在add/add_int.c、add/add_float.c、add/add.h、sub/sub_int.c、sub/sub_float.c、sub/sub.h、main.c中。

文件main.c

#include <stdio.h>

#include "add.h"

#include "sub.h"

int main(void)

{

int input = 0;

int a = 10, b = 12;

float x= 1.23456,y = 9.87654321;

printf("int a+b IS:%d\n",a+b);

printf("int a-b IS:%d\n",a-b);

printf("float x+y IS:%f\n",x+y);

printf("float x-y IS:%f\n",x-y);

return 0;

}

add.h

#ifdef __ADD_H__

#define __ADD_H__

extern int add_int(int a, int b);

extern float add_float(float a, float b);

#endif

add_flaot.h

float add_float(float a, float b)

{

return a+b;

}

add_int.c

int add_int(int a, int b)

{

return a+b;

}

add.h

#ifdef __ADD_H__

#define __ADD_H__

extern float sub_float(float a, float b);

extern int sub_int(int a, int b);

#endif

sub_float.c

float sub_float(float a, float b)

{

return a-b;

}

sub_int.c

int sub_int(int a, int b)

{

return a-b;

}

命令行编译程序:

#gcc -c add/add_int.c -o add/add_int.o      #生成add_int.o目标函数

#gcc -c add/add_float.c -o add/add_float.o   #生成add_float.o目标函数

#gcc -c sub/sub_int.c -o sub/sub_int.o       #生成sub_int.o目标函数

#gcc -c sub/sub_float.c -o sub/sub_float.o    #生成sub_float.o目标函数

#gcc -c main.c -o main.o  -I ./add -I ./sub                #生成main.o目标函数

#gcc -o casu add/add_int.o add/add_float.o sub/sub_int.o sub/sub_float.o main.o

#链接生成cacu

多文件的makefile

#生成casu,“;”右边为目标

casu:add_int.o add_float.o sub_int.o sub_float.o main.o

gcc -o casu add/add_int.o add/add_float.o \          # \为连接符

sub/sub_int.o sub/sub_float.o main.o

#生成add_int.o的规则,将add_int.c编译生成目标文件add_int.o

add_int.o:add/add_int.c add/add.h

gcc -c -o add/add_int.o add/add_int.c

#生成add_float.o的规则

add_float.o:add/add_float.c add/add.h

gcc -c -o add/add_float.o add/add_float.c

#生成sub_int.o的规则

sub_int.o:sub/sub_int.c sub/sub.h

gcc -c -o sub/sub_int.o sub/sub_int.c

#生成sub_float.o的规则

sub_float.o:sub/sub_float.c sub/sub.h

gcc -c -o sub/sub_float.o sub/sub_float.c

#生成main.o的规则

main.o:main.c add/add.h sub/sub.h

gcc -c -o main.o main.c -Iadd -Isub

#清理规则

clean:

rm -f casu add/add_int.o add/add_float.o \

sub/sub_int.o sub/sub_float.o main.o

使用自定义变量的makefile文件:

CC = gcc                                #CC定义成gcc

CFLAGES =    -Iadd -Isub -O2   #加入头文件搜索路径sub和add,O2为优化#目标文件

OBJS = add/add_int.o add/add_float.o \

sub/sub_int.o sub/sub_float.o main.o

TARGET = casu                           #生成的可执行文件

RM = rm -f                              #删除的命令

$(TARGET):$(OBJS)                       #TARGET目标,需要先生成OBJS目标

$(CC) -o $(TARGET) $(OBJS) $(CFLAGES)   #生成可执行文件

$(OBJS):%.o:%.c          #将OBJS中所有扩展名为.o的文件替换成扩展名为.c的文件

$(CC) -c $(CFLAGES) $< -o $@        #采用CFLAGS指定的选项编译生成目标文件

clean:                               #清理

-$(RM) $(TARGET) $(OBJS)           #删除所有的目标文件和可执行文件

使用预定义变量的makefile文件:

CFLAGES =    -Iadd -Isub -O2               #编译选项

OBJS = add/add_int.o add/add_float.o \

sub/sub_int.o sub/sub_float.o main.o

TARGET = casu                          #生成的可执行文件

$(TARGET):$(OBJS)                       #TARGET目标,需要先生成OBJS目标

$(CC) -o $(TARGET) $(OBJS) $(CFLAGES)  #生成可执行文件

$(OBJS):%.o:%.c          #将OBJS中所有扩展名为.o的文件替换成扩展名为.c的文件

$(CC) -c $(CFLAGES) $< -o $@        #采用CFLAGS指定的选项编译生成目标文件

clean:                               #清理

-$(RM) $(TARGET) $(OBJS)           #删除所有的目标文件和可执行文件

使用自动变量的makefile文件:

CFLAGES =    -Iadd -Isub -O2               #编译选项

OBJS = add/add_int.o add/add_float.o \

sub/sub_int.o sub/sub_float.o main.o

TARGET = casu                           #生成的可执行文件

$(TARGET):$(OBJS)                       #TARGET目标,需要先生成OBJS目标

$(CC) -o  $@  $^ $(CFLAGES)          #生成可执行文件

$(OBJS):%.o:%.c          #将OBJS中所有扩展名为.o的文件替换成扩展名为.c的文件

$(CC) -c $<  $(CFLAGES) -o $@      #采用CFLAGS指定的选项编译生成目标文件

clean:                               #清理

-$(RM) $(TARGET) $(OBJS)           #删除所有的目标文件和可执行文件

使用搜索路径的makefile文件:

CFLAGES =    -Iadd -Isub -O2

OBJSDIR = .objs

VPATH = add:sub:.

OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o

TARGET = casu

$(TARGET):$(OBJSDIR) $(OBJS)      #先检测OBJSDIR和OBJS依赖项是否存在

$(CC) -o $(TARGET) $(OBJSDIR)/*.o $(CFLAGES)

#将OBJSDIR目录中所有的.o文件链接成casu

$(OBJS):%.o:%.c

$(CC) -c  $< $(CFLAGES) -o $(OBJSDIR)/$@ #生成目标文件,存放在OBJSDIR目录中

$(OBJSDIR):

mkdir -p ./$@            #建立目录,-p选项可以忽略父目录不存在的错误

clean:

-$(RM) $(TARGET)        #删除casu

-$(RM) $(OBJSDIR)/*.o    #删除OBJSDIR目录下的所有.o文件

使用自动推导规则的makefile

CFLAGS = -Iadd -Isub -O2         # 用户自定义变量

VPATH=add:sub                # 搜索路径

OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o

TARGET = cacu

$(TARGET):$(OBJS)             #OBJS依赖项的规则自动生成

$(CC) -o $(TARGET) $(OBJS) $(CFLAGS)    #链接文件

clean:

-$(RM) $(TARGET)        #“-”表示当前操作失败时不报错,命令继续执行

-$(RM) $(OBJS)

使用函数的makefile文件:

CC = gcc                               #CC定义成gcc

VPATH =add:sub

CFLAGES =    -Iadd -Isub -O2     #加入头文件搜索路径sub和add,O2为优化#目标文件

TARGET = casu                         #生成的可执行文件

DIRS = sub add .                     #DIRS字符串的值为目录add、sub和当前目录

FILES = $(foreach dir, $(DIRS),$(wildcard $(dir)/*.c))  #查找所用目录下的.c文件

OBJS = $(patsubst %.c,%.o,$(FILES))          #将.c替换成.o

$(TARGET):$(OBJS)                        #TARGET目标,需要先生成OBJS目标

$(CC) -o $(TARGET) $(OBJS) $(CFLAGES)   #生成可执行文件

clean:                                  #清理

-$(RM) $(TARGET) $(OBJS)              #删除所有的目标文件和可执行文件

makefile(一)的更多相关文章

  1. 说说Makefile那些事儿

    说说Makefile那些事儿 |扬说|透过现象看本质 工作至今,一直对Makefile半知半解.突然某天幡然醒悟,觉得此举极为不妥,只得洗心革面从头学来,以前许多不明觉厉之处顿时茅塞顿开,想想好记性不 ...

  2. 编写一个通用的Makefile文件

    1.1在这之前,我们需要了解程序的编译过程 a.预处理:检查语法错误,展开宏,包含头文件等 b.编译:*.c-->*.S c.汇编:*.S-->*.o d.链接:.o +库文件=*.exe ...

  3. 编写简单的Makefile文件

    makefile中的编写内容如下: www:hello.c x.h gcc hello.c -o hello clean: rm hello www:hello.c  x.h 表示生成www这个文件需 ...

  4. 简单编写Makefile

    相信很多朋友都有过这样的经历,看着开源项目中好几页的makefile文件,不知所云.在日常学习和工作中,也有意无意的去回避makefile,能改就不写,能用ide就用ide.其实makefile并没有 ...

  5. [转]Linux中configure/makefile

    本文教你如何使用autoconf.automake等来制作一个以源代码形式(.tar.gz)发布的软件.并可在执行configure时使用自定义参数. 一.概述和基础知识 在Linux下得到一个以源代 ...

  6. Linux内核配置、编译及Makefile简述

    Hi,大家好!我是CrazyCatJack.最近在学习Linux内核的配置.编译及Makefile文件.今天总结一下学习成果,分享给大家^_^ 1.解压缩打补丁 首先是解压缩你获取到的Linux内核. ...

  7. make 查找的文件名顺序为:“GNUmakefile”、“makefile”、“Makefile”

    默认的情况下,make会在工作目录(执行make的目录)下按照文件名顺序寻找makefile文件读取并执行,查找的文件名顺序为:“GNUmakefile”.“makefile”.“Makefile”. ...

  8. 实例:对2个Makefile的备注

    实例1:Makefile编译链接简单.c函数 example.c Makefile exe: example.c gcc example.c -o exe clean: rm exe 执行效果: 实例 ...

  9. Linux中C程序调试、makefile

    gcc基本语法格式:gcc [-选项] 源文件 [-选项] 目标文件,GCC编译C程序的过程: 预处理:gcc -E hello.c hello.i.-E指定执行到预处理结束,下面类似. 编译:gcc ...

  10. Linux工具入门:make工具与Makefile文件

    1. make工具 利用make工具可以自动完成编译工作,这些工作包括: 如果修改了某几个源文件,则只重新编译这几个源文件 如果某个头文件被修改了,则重新编译所有包含该头文件的源文件 利用这种自动编译 ...

随机推荐

  1. C#如何调用以管理员身份运行的cmd命令提示符

    windows自从vista.win7.win8/8.1以及win10以来,命令行提示符分为两种模式,一种是普通用户模式,一种的管理员模式,很多情况下,我们的程序需要在命令提示符(管理员身份)的状况下 ...

  2. Python3源码学习-requests

    源码:https://github.com/small99/AutoLink 本地安装包 version.txt记录版本号. 通过requests GET最新git上版本号. import codec ...

  3. 用寄快递模拟数据在网络中的传送过程,发送一个ip数据报到接受这个ip数据报经历的过程

    发送一个ip数据报到接受这个ip数据报经历的过程 好比寄一个快递的过程 这个包裹一共有三层, 这个包裹的最里面是数据,数据 第二层写着目的ip地址和源ip地址,即收件人和发件人的姓名 第三层也就是最外 ...

  4. Java String类和StringBuffer类的区别

    1.String与StringBuffer的区别简单地说,就是一个变量和常量的关系.StringBuffer对象的内容可以修改:而String对象一旦产生后就不可以被修改,重新赋值其实是两个对象.St ...

  5. [ZZ] matlab中小波变换函数dwt2和wavedec2 系数提取函数appcoef2和detcoef2

    https://zhidao.baidu.com/question/88038464.html DWT2是二维单尺度小波变换,其可以通过指定小波或者分解滤波器进行二维单尺度小波分解. 而WAVEDEC ...

  6. 【配置阿里云 I】申请配置阿里云服务器,并部署IIS和开发环境,项目上线经验

    https://blog.csdn.net/vapaad1/article/details/78769520 最近一年在实验室做web后端开发,涉及到一些和服务器搭建及部署上线项目的相关经验,写个帖子 ...

  7. webstorm的相关操作

    1.webstorm修改tab键的缩进

  8. RAM和Flash区别

    都是随机存储器,断电数据消失,但Flash有点不一样,它在消失数据之前,添加了一个""性质",这个性质能上电后再识别,且把这个信号返回到ram中,这样近似的把flash当 ...

  9. Emoji表情代码大全

    Name   Unified DoCoMo KDDI Softbank Google Wechat   black sun with rays U+2600 U+E63E U+E488 U+E04A ...

  10. vscode setting

    { "files.autoSave": "onFocusChange", "window.openFilesInNewWindow": tr ...