- 1、本文档共86页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
多规则目标 Makefile中,一个文件作为多个规则的目标出现。 此目标文件的所有依赖文件将会被合并成此目标一个依赖文件列表,其中任何一个依赖文件比目标更新(比较目标文件和依赖文件的时间戳)时,make将会执行特定的命令来重建这个目标。 重建此目标的命令只能出现在一个规则中。如果多个规则同时给出重建此目标的命令,make将使用最后一个规则所用的命令,同时提示错误信息 如果目标的任何一个规则没有定义重建此目标的命令,make将会寻找一个合适的隐含规则来重建此目标。 多规则目标举例 objects = foo.o bar.o foo.o : defs.h bar.o : defs.h test.h $(objects) : config.h 这是一个描述规则,仅仅用来描述依赖关系 foo.o和bar.o都是多规则的目标,如果config.h文件发生变化,则foo.o和bar.o都会自动重建。 静态模式规则 静态模式规则是这样一个规则:规则存在多个目标,并且不同的目标可以根据目标文件的名字来自动构造出依赖文件。 基本语法 TARGETS ...: TARGET-PATTERN: PREREQ-PATTERNS COMMANDS ... --“TAGETS”列出了此规则的一系列目标文件 --可以使用通配符 --目标模式(TAGET-PATTERN) --依赖模式(PREREQ-PATTERNS) --说明了如何为目标文件生成依赖文件 --生成方法:从目标模式的目标文件中抽取一部分字符(称为茎)来代替依赖模式中的相应部分。 自动生成依赖文件的过程 在目标模式和依赖模式中,一般需要包含模式字符 %”。在目标模式(TAGET-PATTERN)中“%”可以匹配目标文件的任何部分,模式字符“%”匹配的部分就是“茎”。比如目标“foo.o”符合模式“%.o”,其“茎”为“foo”。而目标“foo.c”和“foo.out”就不符合此目标模式。 每一个目标的依赖文件是使用此目标的“茎”代替依赖模式 PREREQ-PATTERNS)中的模式字符“%”而得到。如果依赖模式(PREREQ-PATTERNS)为“%.c”,那么使用“ foo”替代依赖模式中的“%”得到的依赖文件就是“foo.c”。 静态模式举例 objects = foo.o bar.o all: $(objects) $(objects): %.o: %.c $(CC) -c $(CFLAGS) $ -o $@ 对目标foo.o,根据目标模式”%.o”,所以其茎应为foo,使用该茎,替代依赖模式”%.c”中的模式字符“%”,因此foo.o的依赖文件就是foo.c 命令行中“$”和“$@”是自动化变量,“$”表示规则中的第一个依赖文件。 $@表示规则中的目标文件 foo.o : foo.c $(CC) -c $(CFLAGS) foo.c -o foo.o bar.o : bar.c $(CC) -c $(CFLAGS) bar.c -o bar.o 双冒号规则 双冒号规则就是使用“::”代替普通规则的“:”得到的规则 双冒号规则允许在多个规则中为同一个目标指定不同的重建目标的命令 注意:Makefile中,一个目标可以出现在多个规则中。但是这些规则必须是同一种规则,要么都是普通规则,要么都是双冒号规则。而不允许一个目标同时出现在两种不同的规则中 双冒号规则和普通规则的区别 对于一个没有依赖而只有命令行的双冒号规则,当引用此目标时,规则的命令将会被无条件执行。普通规则呢? 当同一个文件作为多个双冒号规则的目标时。这些不同的规则会被独立的处理。就是说多个双冒号规则中的每一个的依赖文件被改变之后,make 只执行此规则定义的命令,而其它的以这个文件作为目标的双冒号规则将不会被执行普通规则呢? 双冒号规则举例 Newprog :: foo.c $(CC) $(CFLAGS) $ -o $@ Newprog :: bar.c $(CC) $(CFLAGS) $ -o $@ 如果foo.c更改,执行make,根据foo.c文件重建目标newprog 如果bar.c更改,执行make,根据bar.c文件重建目标newprog 如果是普通规则,执行make时会怎样? 执行make时出错,并提示错误信息 自动生成依赖 描述.o文件和头文件的依赖关系。比如main.c中#include “def.h”,因此在Makefile的依赖关系中需要如下描述 mai.o:main.c def.h。 有什么缺点: 1.如果很多源程序文件中用到了头文件,就需要做很多这样的依赖关系描述 2.如果修改了源文
文档评论(0)