前端之家收集整理的这篇文章主要介绍了
make文件自动生成依赖关系,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
make
文件自动生成依赖关系 摘自:跟我一起写Makefile 在Makefile中,我们的依赖关系可能会需要包含一系列的头
文件,比如,如果我们的main.c中有一句“#include "defs.h"”,那么我们的依赖关系应该是: main.o : main.c defs.h C/C++编译器都
支持一个“-M”的选项,即
自动找寻源
文件中包含的头
文件,并
生成一个依赖关系。例如,如果我们执行下面的命令: cc -M main.c 其
输出是: main.o : main.c defs.h 需要提醒一句的是,如果你使用GNU的C/C++编译器,你得用“-MM”参数,不然,“-M”参数会把一些标准库的头
文件也包含进来。 那么,编译器的这个
功能如何与我们的Makefile联系在一起呢。GNU组织建议把编译器为每一个源
文件的
自动生成的依赖关系放到一个
文件中,为每一个“name.c”的
文件都
生成一个“name.d”的Makefile
文件,[.d]
文件中就存放对应[.c]
文件的依赖关系。 于是,我们可以写出[.c]
文件和[.d]
文件的依赖关系,并让make
自动更新或自成[.d]
文件,并把其包含在我们的主Makefile中,这样,我们就可以
自动化地
生成每个
文件的依赖关系了。 这里,我们给出了一个模式规则来产生[.d]
文件: %.d: %.c @set -e; rm -f $@; / $(CC) -M $(CPPFLAGS) $< >; $@.$$$$; / sed 's,/($*/)/.o[ :]*,/1.o $@ :,g' < $@.$$$$ >; $@; / rm -f $@.$$$$ 这个规则的意思是,所有的[.d]
文件依赖于[.c]
文件,“rm -f $@”的意思是
删除所有的目标,也就是[.d]
文件,第二行的意思是,为每个依赖
文件“$<”,也就是[.c]
文件生成依赖
文件,“$@”表示模式“%.d”
文件,如果有一个C
文件是name.c,那么“%”就是“name”, “$$$$”意为一个
随机编号,第二行
生成的
文件有可能是“name.d.12345”,第三行使用sed命令做了一个替换,关于sed命令的
用法请参看相关的使用文档。第四行就是
删除临时
文件。 总而言之,这个模式要做的事就是在编译器
生成的依赖关系中加入[.d]
文件的依赖,即把依赖关系: main.o : main.c defs.h 转成: main.o main.d : main.c defs.h 于是,我们的[.d]
文件也会
自动更新了,并会
自动生成了,当然,你还可以在这个[.d]
文件中加入的不只是依赖关系,
包括生成的命令也可一并加入,让每个 [.d]
文件都包含一个完赖的规则。一旦我们完成这个工作,接下来,我们就要把这些
自动生成的规则放进我们的主Makefile中。我们可以使用 Makefile的“include”命令,来引入别的Makefile
文件(前面讲过),例如: sources = foo.c bar.c include $(sources:.c=.d) 上述语句中的“$(sources:.c=.d)”中的“.c=.d”的意思是做一个替换,把变量$(sources)所有[.c]的字串都替换成 [.d]。