首页 > 解决方案 > 在推荐的使用 makefile 生成自动依赖项中的 %.o 目标的先决条件中列出 c/c++ 源文件是否有用?

问题描述

我指的是为 GNU make+gcc 推荐的自动依赖生成的高级方法。我本可以在 Mad Scientist 网站上提问,但作者在 SO 上非常活跃。

在该方法中,目标“%.o”的依赖链总结为以下几行:

%.o : %.cxx $(DEPDIR)/%.d
        $(COMPILE.cc) $(OUTPUT_OPTION) $<
        $(POSTCOMPILE)

$(DEPDIR)/%.d: ;
.PRECIOUS: $(DEPDIR)/%.d

include $(wildcard $(patsubst %,$(DEPDIR)/%.d,$(basename $(SRCS))))

根据我对 GNU make 的理解和一些基本的实验,在我看来,在目标“%.o”的先决条件列表中包含“%.cxx”是不必要和多余的。我们可以有完全相同的行为:

%.o : $(DEPDIR)/%.d
        $(COMPILE.cc) $(OUTPUT_OPTION) $*.cxx
        $(POSTCOMPILE)

$(DEPDIR)/%.d: ;
.PRECIOUS: $(DEPDIR)/%.d

include $(wildcard $(patsubst %,$(DEPDIR)/%.d,$(basename $(SRCS))))

基本原理是依赖文件明确列出源文件作为目标文件的先决条件。当然,原始页面中的精彩分析的各个方面仍然存在(例如,可能需要删除内置规则,丢失的依赖文件无论如何都会触发目标文件的规则等)

这似乎是一个微不足道的变化,但有一个重要的含义:从 C 源文件构建的目标对象文件的先决条件列表将与从 C++ 源文件或任何其他编译语言构建的目标对象文件完全相同,这可以将更多工作委派给某些宏,并且对于所有编译语言只有一个规则:

%.o: %.d
        $(COMPILE) $(OUTPUT_OPTIONS) $(SOURCE)
        $(POSTCOMPILE)

宏 COMPILE、OUTPUT_OPTIONS 和 SOURCE 可以使用目标特定值和 $* 分析的任意组合来完成工作。

所以,问题是:在这种情况下,除了识别源文件中使用的语言之外,在目标对象文件的先决条件列表中列出源文件(除了依赖文件之外)是否有用?

标签: makefilegnu-make

解决方案


另一种方法是正确的方法:

%.o : %.cxx

那是因为你想在被编辑的.o时候重建。.cxx一个从不编辑.d文件。

并且不依赖%.d.

但是,当%.d包含在 makefile 中时,makefiles 会依赖它.d并尝试更新它,因此您仍然需要那个空$(DEPDIR)/%.d: ;规则。

第一次构建时不需要依赖,因为一切都需要构建。下一个构建依赖项用于确定需要重建的内容。

.o一种更直接的方法是将所有依赖文件放在同一目录中的相应文件旁边。因为不同的构建模式(调试/发布)可能有不同的包含(每个构建模式必须有自己的输出目录,这样你就可以在模式之间切换而不必先做make clean)。在我看来,不应遵循该文章中处理依赖关系的示例。


推荐阅读