【发布时间】: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