大佬教程收集整理的这篇文章主要介绍了makefile – 关于GNU make依赖文件* .d,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
# This rule states that fileA.o depends on fileA.c (obvIoUsly),but also # on the header files fileA.h,fileB.h and fileC.h fileA.o: fileA.c fileA.h fileB.h fileC.h
请注意,该规则没有配方.可以添加一个配方,但严格来说没有必要,因为GNU make可以依赖隐式规则(带配方)将* .c文件编译成* .o文件.
无论如何,手动编写这样的规则是一项地狱般的任务.想象一下使makefile规则与源代码中的#include语句保持同步的工作.
GNU make手册在第4.14章“自动生成先决条件”中描述了一种自动执行此过程的方法.该过程从为每个源文件生成* .d文件开始.我引用:
手册进行:
%.d: %.c @set -e; rm -f $@; \ $(CC) -M $(CPPFLAGS) $< > $@.$$$$; \ sed 's,\($*\)\.o[ :]*,\1.o $@ :,g' < $@.$$$$> $@; \ rm -f $@.$$$$
遗憾的是,该手册没有详细解释这条规则是如何实际运作的.是的,它提供了所需的name.d文件,但为什么呢?该规则非常混淆..
在查看此规则时,我感觉它的配方只能在Linux上顺利运行.我对吗?有没有办法让这个配方在Windows上正确运行?
任何帮助是极大的赞赏 :-)
@set -e;
rm -f $@;
让编译器生成dep文件并输出到后缀为pid的临时文件($< = first prerequisite =%.c,$$$$ - > $$ – > pid)
$(CC) -M $(CPPFLAGS) $< > $@.$$$$;
捕获匹配$* .o($* = match stem =%)的目标,将其替换为目标后跟依赖项文件本身,输出到dep文件
sed 's,g' < $@.$$$$> $@; \
删除temp dep
rm -f $@.$$$$
让我们插入foo,CC = gcc和CPPFLAGS =”来看看make完成扩展后会发生什么:
foo.d: foo.c @set -e; rm -f foo.d; \ gcc -M foo.c > foo.d.$$; \ sed 's,\(foo\)\.o[ :]*,\1.o foo.d :,g' < foo.d.$$> foo.d; \ rm -f foo.d.$$
sHell本身会将$$扩展为pid,而dep文件中的最终规则将类似于
foo.o foo.d : foo.c foo.h someheader.h
请注意,这是一种非常过时的生成依赖关系的方法,如果您正在使用GCC或clang,则可以将generate them作为编译本身的一部分使用CPPFLAGS = -MMD -MP.
假设您有一个名为foo的程序:
objs := foo.o bar.o deps := $(objs:.o=.d) vpath %.c $(dir $(MAKEFILE_LIST)) CPPFLAGS += -MMD -MP foo: $(objs) .PHONY: clean clean: ; $(RM) foo $(objs) $(deps) -include $(deps)
这就是你所需要的,内置规则将完成其余的工作.显然,如果您希望将对象文件放在不同的文件夹中,或者您希望在源树之外构建,那么事情会更复杂一些.
vpath指令允许您在不同的目录中运行make并在那里创建文件,例如make -f path / to / source / Makefile.
以上是大佬教程为你收集整理的makefile – 关于GNU make依赖文件* .d全部内容,希望文章能够帮你解决makefile – 关于GNU make依赖文件* .d所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。