我正在阅读 Makefile,并且找到了一种自动生成先决条件的方法,该方法不同于 this tutorial 。该方法如下:
DEPFILES = $(SRCFILES:src/%.cpp=obj/%.d)
-include $(DEPFILES)
obj/%.o: src/%.cpp | obj
@echo compiling $(@F) ...
@$(CXX) -O3 -ggdb $(CXXFLAGS) -c -o $(@) -MMD -MP $(<)
obj:
@mkdir $@
我可以弄清楚gcc如何生成.d文件,当我第一次执行make
命令时,-include $(DEPFILES)
将失败并且obj/% .o
目标将被调用并生成.d文件。但我的问题是:当我修改一些源文件并再次执行 make
时,会发生什么?我认为 -include $(DEPFILES)
会成功,并且 .d 文件包含在 makefile 中,因此 .d 文件中的 obj/%.o
目标包含在makefile,但实际上我已经在源makefile中定义了 obj/%.o 目标,是否有冲突?
我做了一些实验,发现源makefile中的obj/%.o
目标将被调用(因为echo
命令被执行)并且.d文件将被调用如有必要进行更新。但这是为什么呢?我们需要 .d 文件中的目标来了解依赖关系以及为什么它没有被调用?
最佳答案
当您设置 Makefile 时,一行仅是目标和依赖项,后面没有任何指令,这只是一个附加依赖项。因此,举个例子:
a.o: a.cpp
g++ -o $@ -c $+
a.o: a.h b.h
第一行说构建a.o
,它依赖于a.cpp
,然后是如何构建它的说明。第二个 a.o
只是添加了对 a.h
和 b.h
的额外依赖项。这基本上就是上述机制正在做的事情,因为它定义了很多额外的依赖行,但没有添加任何指令。
关于c++ - Makefile:为什么这种自动生成先决条件的方法有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25833601/