【发布时间】:2016-08-17 16:41:59
【问题描述】:
在程序的生成文件中,必须编写规则来定义每个目标文件的依赖关系。考虑目标文件fileA.o。很明显,这个目标文件依赖于源文件fileA.c。但它也将取决于此源文件包含的所有头文件。所以应该在makefile中添加以下规则:
# 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 文件开始。我引用:
对于每个源文件 name.c 都有一个 makefile name.d 列出目标文件 name.o 依赖的文件.
手册继续:
以下是从名为 name.c 的 C 源文件生成名为 name.d 的先决条件文件(即 makefile)的模式规则: p>
%.d: %.c
@set -e; rm -f $@; \
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
遗憾的是,该手册并未详细解释此规则的实际工作原理。是的,它提供了所需的 name.d 文件,但为什么呢?规则很混乱..
当看到这条规则时,我觉得它的配方只能在 Linux 上顺利运行。我对吗?有没有办法让这个配方也能在 Windows 上正确运行?
非常感谢任何帮助:-)
【问题讨论】: