【问题标题】:Makefile: Why this method of Automatically Generating Prerequisites works?Makefile:为什么这种自动生成先决条件的方法有效?
【发布时间】:2014-09-14 13:10:32
【问题描述】:

我正在阅读 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/%.otarget 将被调用并生成 .d 文件。但我的问题是:当我修改一些源文件并再次执行make 时,会发生什么?我认为-include $(DEPFILES)会成功并且.d文件包含在makefile中,所以.d文件中的obj/%.o目标包含在makefile中,但实际上我已经在origin makefile中定义了obj/%.o目标,是有冲突吗?

我做了一些实验,发现源makefile中的obj/%.o目标将被调用(因为echo命令被执行)并且.d文件将在必要时更新。但这是为什么呢?我们需要 .d 文件中的目标来了解依赖关系以及为什么不调用它?

【问题讨论】:

  • 您查看过.d 文件的内容吗?他们解释了其中的一部分。 This page 也可能对阅读有所帮助。
  • 谢谢。该页面对我很有帮助!

标签: c++ unix makefile prerequisites


【解决方案1】:

当您设置 Makefile 时,一行只是一个目标和依赖项,后面没有说明,它只是一个附加依赖项。所以,举个例子:

a.o: a.cpp
   g++ -o $@ -c $+

a.o: a.h b.h

第一行说构建a.o,它依赖于a.cpp,然后是如何构建它的说明。第二个a.o 只是添加了对a.hb.h 的额外依赖。这基本上就是上述机制在做的事情,因为它定义了很多额外的依赖行,但没有添加任何指令。

【讨论】:

  • 谢谢,我知道了。我还有一个问题:命令obj/%.o: src/%.cpp | obj 中的| 是什么意思,什么时候会调用'obj' 的目标?谢谢。
  • 根据GNU make manual| 表示它是一个仅订单依赖项。这意味着obj/%.o 依赖于obj,但不会因为obj 更改而重新构建。在这种情况下,它会确保在尝试将对象写入其中之前使用 mkdir 创建obj 目录
猜你喜欢
  • 2012-02-21
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2012-09-18
相关资源
最近更新 更多