Makefile为单个目标的多个依赖项?

Ste*_* Lu 5 c++ makefile

要生成依赖文件,我可以使用类似的东西来生成依赖文件:

-include $(patsubst %.cpp,build/%.d,$(SRC))
build/%.o: %.cpp
    $(CC) $(CXXFLAGS) -c -o $@ $<
    $(CC) $(CXXFLAGS) -MM -MT $@ -MF $(patsubst %.o,%.d,%@) $<
Run Code Online (Sandbox Code Playgroud)

这会生成所有内容,并将对象和依赖项文件放入我想要的构建目录中.但这会为<file>.o目标创建两个依赖关系,一个来自-include规则,一个是所有头依赖关系,另一个来自模式规则.这是否会被正确解释,即当修改标题时,将通过为模式规则指定的命令重新编译对象?

编辑:所以这种方法确实很有效.我想我希望有人提供一个答案,让我能够深入了解make这些情况下究竟是什么.例如,如果为同一目标的两个规则提供了不同的命令,该怎么办?我的猜测是它会出错,因为执行哪个命令并不明显.

0xC*_*22L 5

您应该再添加一个模式规则来表示.cpp和.d文件之间的依赖关系,并使用该规则创建.d文件(问题的模式规则中的第二行),而不是.d无条件地创建文件.它可能是有意义的引进之间的另一种依赖的所有 .h和.cpp文件,所有 .d文件强制重新创建.d,如果头或源文件更改文件.

这是.d文件的单独规则(希望我做对了):

-include $(patsubst %.cpp,build/%.d,$(SRC))
build/%.o: %.cpp
    $(CC) $(CXXFLAGS) -c -o $@ $<

build/%.d: %.cpp
    $(CC) $(CXXFLAGS) -MM -MT $@ -MF $<
Run Code Online (Sandbox Code Playgroud)

编辑:所以这种方法确实很有效.我想我希望有人提供一个答案,让我能够深入了解在这些情况下make的确切含义.

我担心目前它只会偶然发挥作用(或者你没有从make文件中提供所有相关的部分).请注意,您尚未表示.d文件和.cpp文件之间存在任何依赖关系.但是,这是必需的,以便在包含为make文件片段之前.d更新文件.

例如,如果为同一目标的两个规则提供了不同的命令,该怎么办?我的猜测是它会出错,因为执行哪个命令并不明显.

使用该语法,它不会有所作为.但是在某些特殊情况下,将规则分为两个(尽管其他方面相同的规则)具有优点.我强烈建议您阅读"使用GNU Make管理项目"一书,以掌握使用GNU Make的各种方法.与GNU Make有关的唯一其他建议是阅读以阅读此处的论文.