c++ - Makefile:为什么这种自动生成先决条件的方法有效?

标签 c++ unix makefile prerequisites

我正在阅读 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.hb.h 的额外依赖项。这基本上就是上述机制正在做的事情,因为它定义了很多额外的依赖行,但没有添加任何指令。

关于c++ - Makefile:为什么这种自动生成先决条件的方法有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25833601/

相关文章:

c - execv 未知路径使用情况

sockets - 我不明白有关多播的段落

c++ - 僵尸进程无法通过 waitpid 调用进行清理

ubuntu - 使用 caffe 解析器支持构建armNN时出现问题

c++ - 为什么 gcc 和 clang 会为 std::find 生成这么多代码?

c++ - 如何使用 boost::bind 将返回 int 的函数转换为返回 bool 的函数?

c++ - 我对 C++ 中 '<<' 的运算符重载的使用感到困惑

c++ - makefile 找不到 .o 文件

无法使用 CMAKE 构建 Makefile,未指定编译器

c++ - 跟踪在 C++ 中调用递归函数的次数