您的位置:首页 > 运维架构 > Linux

makefile 《Linux程序设计笔记》

2016-03-03 16:09 447 查看
1、make工具重新编译所有受改动影响的源文件,而不是全部重新编译

2、make的选项和参数

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

all:prog1prog2prog3
.PHONY:all
prog1:prog1.outils.o
cc-oprog1prog1.outils.o
prog2:prog2.o
cc-oprog2prog2.o
prog3:prog3.osort.outils.o
cc-oprog3prog3.osort.outils.o


prog1:prog1.outils.o

表示以来文件与源文件的依赖关系。写法:先写目标的名称,然后紧跟着一个冒号,接着是空格或者tab最后是空格或tab隔开的文件列表

依赖关系暗示着,要生成目标文件,首先得生成它所依赖的文件,如果依赖的文件没有生成,继续往makefile找,直到找到

4、makefile--规则

  (1)必须以tab开头

  (2)各行不能以空格结尾

5、makefile注释

   以#开头

6、makefile--all

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


伪目标

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

   clean:

           rm*.otemp

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

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

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

   .PHONY:clean

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

    .PHONY:clean

   clean:

           rm*.otemp

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

   all:prog1prog2prog3

   .PHONY:all

 

   prog1:prog1.outils.o

           cc-oprog1prog1.outils.o

 

   prog2:prog2.o

           cc-oprog2prog2.o

 

   prog3:prog3.osort.outils.o

           cc-oprog3prog3.osort.outils.o

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

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

   .PHONY:cleanallcleanobjcleandiff

 

   cleanall:cleanobjcleandiff

           rmprogram

 

   cleanobj:

           rm*.o

 

   cleandiff:

           rm*.diff

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

来源: <http://blog.csdn.net/ruglcc/article/details/7814546/>
 
7、makefile--宏

(1)定义宏

  可以在makefile定义,

     VALUE=V

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

makeVALUE=T


(2)使用宏

${VALUE}


8、makefile--特殊字符

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

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

9、GNUmake和gcc

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

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

比如

gcc-MMmain.c2.c3.c


gcc会扫描源文件以查找include语句,然后以一种直接插入到makefile文件中个的格式输出需要的依赖关系清单。

只需要把这个输出结果保存到一个临时文件中,然后把它们插入到makefile中,即可得到一组完美的依赖关系规则。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: