makefile学习笔记

本文详细介绍了Makefile的组成部分,包括显式规则、隐晦规则、变量定义、文件指示和注释。讲解了make的工作流程,如读取Makefile、推导规则、创建依赖关系链等。此外,还探讨了规则的语法、文件搜索路径的设定、伪目标、静态模式规则以及变量的高级用法,如替换、追加、override指示符等。文章通过实例展示了自动化变量的使用,如$@、$<、$?、$^、$+等,并介绍了条件表达式和各种字符串与文件处理函数,帮助读者深入理解并掌握Makefile的编写技巧。
摘要由CSDN通过智能技术生成

file:E:\26.2012linux%C5%E0%D1%B5\Linux%20Basic\1.1Linux%20Base%20Introduction\makefile\GNU%20MAKE%20%D6%D0%CE%C4%CA%D6%B2%E1.pdf
file:E:\26.2012linux%C5%E0%D1%B5\Linux%20Basic\1.1Linux%20Base%20Introduction\makefile\%B8%FA%CE%D2%D2%BB%C6%F0%D0%B4Makefile.pdf
Makefile的组成:
Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。

1、显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书
写者明显指出,要生成的文件,文件的依赖文件,生成的命令。
2、隐晦规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗
糙地简略地书写Makefile,这是由make所支持的。
3、变量的定义。在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有
点你C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置
上。
4、文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像
C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像
C语言中的预编译#if一样;还有就是定义一个多行的命令。有关这一部分的内容,我
会在后续的部分中讲述。
5、注释。Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这
个就像C/C++中的“//”一样。如果你要在你的Makefile中使用“#”字符,可以用反斜框
进行转义,如:“\#”。
make的工作方式
1、读入所有的Makefile。
2、读入被include的其它Makefile。
3、初始化文件中的变量。
4、推导隐晦规则,并分析所有规则。
5、为所有的目标文件创建依赖关系链。
6、根据依赖关系,决定哪些目标要重新生成。
7、执行生成命令。
规则的语法
targets : prerequisites
command
...
或是这样:
targets : prerequisites ; command
command
...
PS:command是命令行,如果其不与“target rerequisites”在一行,那么,必须以[Tab键]
开头,如果和prerequisites在一行,那么可以用分号做为分隔。(见上)
文件搜寻
变量方式:
VPATH = src:../headers
上面的的定义指定两个目录,“src”和“../headers”,make会按照这个顺序进行搜索。
目录由“冒号”分隔。(当然,当前目录永远是最高优先搜索的地方)
关键字:
1、vpath <pattern> <directories>
为符合模式<pattern>的文件指定搜索目录<directories>。
2、vpath <pattern>
清除符合模式<pattern>的文件的搜索目录。
3、vpath
清除所有已被设置好了的文件搜索目录。
eg:
vpath %.h ../headers
该语句表示,要求make在“../headers”目录下搜索所有以“.h”结尾的文件。(如果某文
件在当前目录没有找到的话)
伪目标

.PHONY: cleanall cleanobj cleandiff
cleanall : cleanobj cleandiff
rm program
cleanobj :
rm *.o
cleandiff :
rm *.diff

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

静态模式
静态模式可以更加容易地定义多目标的规则,可以让我们的规则变得更加的有弹性和
灵活。我们还是先来看一下语法:
<targets ...>: <target-pattern>: <prereq-patterns ...>
<commands>
...
targ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值