makefile 《Linux程序设计笔记》



1、make工具重新编译所有受改动影响的源文件,而不是全部重新编译


2、 make的选项和参数

选项意义
-k使make命令在发现错误时继续执行
-n让make命令输出将要执行的操作而不是真正执行
-f<filename>默认使用当前目录的makefile  如果是加了-f,就是指定filename为使用的makefile


3、 makefile -- 依赖关系

   
   
all : prog1 prog2 prog3
.PHONY : all
prog1 : prog1.o utils.o
cc -o prog1 prog1.o utils.o
prog2 : prog2.o
cc -o prog2 prog2.o
prog3 : prog3.o sort.o utils.o
cc -o prog3 prog3.o sort.o utils.o

prog1: prog1.o utils.o
表示以来文件与源文件的依赖关系。 写法:先写目标的名称,然后紧跟着一个冒号, 接着是空格或者tab 最后是空格或tab隔开的文件列表
依赖关系暗示着,要生成目标文件,首先得生成它所依赖的文件,如果依赖的文件没有生成,继续往makefile找,直到找到


4、 makefile -- 规则

    (1)必须以tab开头
    (2)各行不能以空格结尾

5、makefile 注释
     以#开头

6、makefile -- all

all作用: 默认makefile是生成找到的第一个目标文件,但是使用All就可以生成多个目标文件

伪目标

最早先的一个例子中,我们提到过一个“clean”的目标,这是一个“伪目标”,

   clean:

           rm *.o temp

正像我们前面例子中的“clean”一样,即然我们生成了许多文件编译文件,我们也应该提供一个清除它们的“目标”以备完整地重编译而用。 (以“make clean”来使用该目标)

因为,我们并不生成“clean”这个文件。“伪目标”并不是一个文件,只是一个标签,由于“伪目标”不是文件,所以make无法生成它的依赖关系和决定它是否要执行。我们只有通过显示地指明这个“目标”才能让其生效。当然,“伪目标”的取名不能和文件名重名,不然其就失去了“伪目标”的意义了。

当然,为了避免和文件重名的这种情况,我们可以使用一个特殊的标记“.PHONY”来显示地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。

   .PHONY : clean

只要有这个声明,不管是否有“clean”文件,要运行“clean”这个目标,只有“make clean”这样。于是整个过程可以这样写:

    .PHONY: clean

   clean:

           rm *.o temp

伪目标一般没有依赖的文件。但是,我们也可以为伪目标指定所依赖的文件。伪目标同样可以作为“默认目标”,只要将其放在第一个。一个示例就是,如果你的Makefile需要一口气生成若干个可执行文件,但你只想简单地敲一个make完事,并且,所有的目标文件都写在一个Makefile中,那么你可以使用“伪目标”这个特性:

   all : prog1 prog2 prog3

   .PHONY : all

 

   prog1 : prog1.o utils.o

           cc -o prog1 prog1.o utils.o

 

   prog2 : prog2.o

           cc -o prog2 prog2.o

 

   prog3 : prog3.o sort.o utils.o

           cc -o prog3 prog3.o sort.o utils.o

我们知道,Makefile中的第一个目标会被作为其默认目标。我们声明了一个“all”的伪目标,其依赖于其它三个目标。由于伪目标的特性是,总是被执行的,所以其依赖的那三个目标就总是不如“all”这个目标新。所以,其它三个目标的规则总是会被决议。也就达到了我们一口气生成多个目标的目的。“.PHONY : all”声明了“all”这个目标为“伪目标”。

随便提一句,从上面的例子我们可以看出,目标也可以成为依赖。所以,伪目标同样也可成为依赖。看下面的例子:

   .PHONY: cleanall cleanobj cleandiff

 

   cleanall : cleanobj cleandiff

           rm program

 

   cleanobj :

           rm *.o

 

   cleandiff :

           rm *.diff

“makeclean”将清除所有要被清除的文件。“cleanobj”和“cleandiff”这两个伪目标有点像“子程序”的意思。我们可以输入“makecleanall”和“make cleanobj”和“makecleandiff”命令来达到清除不同种类文件的目的


 

7、 makefile -- 宏

(1)定义宏
    可以在makefile定义,
         VALUE=V
     也可以在make命令输入 , 此时将覆盖文件中的宏定义。此时宏定义必须以单个参数传递,而且应该避免在宏定义中使用空格
   
   
make VALUE=T

(2)使用宏
   
   
${VALUE}

8、 makefile -- 特殊字符

    -:执行这条命令的时候忽略错误。比较实用的用法是:-rm 因为经常会出现rm的文件不存在

    @:执行这条命令前不要将该命令显示在标准输出上, 如果想用echo命令给出一些说明信息, 这个字符很有用。


9、GNU make 和 gcc

make命令的-jN  N是数字,这个选项允许make同时执行N条命令,一般是可以从小的数字开始尝试,比如-j3

gcc的-MM选项,作用是产生一个适用于make命令的依赖关系清单。 这样就可以抄了,,不用自己分析

比如
   
   
gcc -MM main.c 2.c 3.c

gcc会扫描源文件以查找include语句,然后以一种直接插入到makefile文件中个的格式输出需要的依赖关系清单。
只需要把这个输出结果保存到一个临时文件中, 然后把它们插入到makefile中, 即可得到一组完美的依赖关系规则。






























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值