- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Makefile 基础知识(2)
来源: ChinaUnix 博客
跟我一起写 Makefile(四)收藏书写规则
————
规则包含两个部分,一个是依赖关系,一个是生成目标的方法。
在 Makefile 中,规则的顺序是很重要的,因为,Makefile 中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,所以一定要让 make 知道你的最终目标是什么。一般来说,定义在Makefile 中的目标可能会有很多,但是第一条规则中的目标将被确立为最终的目标。如果第一条规则中的目标有很多个,那么,第一个目标会成为最终的目标。make 所完成的也就是这个目标。
好了,还是让我们来看一看如何书写规则。一、规则举例
foo.o : foo.c defs.h # foo 模块
cc -c -g foo.c
看到这个例子,各位应该不是很陌生了,前面也已说过,foo.o 是我们的目标,foo.c 和 defs.h 是目标所依赖的源文件, 而只有一个命令“cc -c -g foo.c”(以 Tab 键开头)。这个规则告诉我们两件事:
1、文件的依赖关系,foo.o 依赖于 foo.c 和 defs.h 的文件,如果 foo.c 和 defs.h 的文件日期要比 foo.o 文件日期
要新,或是 foo.o 不存在,那么依赖关系发生。
2、如果生成(或更新)foo.o 文件。也就是那个 cc 命令,其说明了,如何生成 foo.o 这个文件。(当然 foo.c 文件
include 了 defs.h 文件) 二、规则的语法
targets : prerequisites
command
...
或是这样:
targets : prerequisites ; command command
...
targets 是文件名,以空格分开,可以使用通配符。一般来说,我们的目标基本上是一个文件,但也有可能是多个文件。command 是命令行,如果其不与“target:prerequisites”在一行,那么,必须以[Tab 键]开头,如果和 prerequisites 在一行,那么可以用分号做为分隔。(见上)
prerequisites 也就是目标所依赖的文件(或依赖目标)。如果其中的某个文件要比目标文件要新,那么,目标就被认为
是“过时的”,被认为是需要重生成的。这个在前面已经讲过了。
如果命令太长,你可以使用反斜框(?\?)作为换行符。make 对一行上有多少个字符没有限制。规则告诉 make 两件事, 文件的依赖关系和如何成成目标文件。
一般来说,make 会以 UNIX 的标准 Shell,也就是/bin/sh 来执行命令。三、在规则中使用通配符
如果我们想定义一系列比较类似的文件,我们很自然地就想起使用通配符。make 支持三各通配符:“*”,“?”和“[...]”。这是和 Unix 的 B-Shell 是相同的。
波浪号(“~”)字符在文件名中也有比较特殊的用途。如果是“~/test”,这就表示当前用户的$HOME 目录下的 test 目录。而“~hchen/test”则表示用户 hchen 的宿主目录下的 test 目录。(这些都是 Unix 下的小知识了,make 也支持) 而在 Windows 或是 MS-DOS 下,用户没有宿主目录,那么波浪号所指的目录则根据环境变量“HOME”而定。
通配符代替了你一系列的文件,如“*.c”表示所以后缀为 c 的文件。一个需要我们注意的是,如果我们的文件名中有通
配符,如:“*”,那么可以用转义字符“\”,如“\*”来表示真实的“*”字符,而不是任意长度的字符串。好吧,还是先来看几个例子吧:
clean:
rm -f *.o
上面这个例子我不不多说了,这是操作系统Shell 所支持的通配符。这是在命令中的通配符。print: *.c
lpr -p $? touch print
上面这个例子说明了通配符也可以在我们的规则中,目标print 依赖于所有的[.c]文件。其中的“$?”是一个自动化变量,我会在后面给你讲述。
objects = *.o
上面这个例子,表示了,通符同样可以用在变量中。并不是说[*.o]会展开,不!objects 的值就是“*.o”。Makefile 中的变量其实就是 C/C++中的宏。如果你要让通配符在变量中展开,也就是让 objects 的值是所有[.o]的文件名的集合,那么,你可以这样:
objects := $(wildcard *.o)
这种用法由关键字“wildcard”指出,关于 Makefile 的关键字,我们将在后面讨论。四、文件搜寻
在一些大的工程中,有大量的源文件,我们通常的做法是把这许多的源文件分类,并存放在不同的目录中。所以,当
make 需要去找寻
文档评论(0)