要生成依赖项文件,我可以使用类似的东西来生成依赖项文件:
-include $(patsubst %.cpp,build/%.d,$(SRC))
build/%.o: %.cpp
$(CC) $(CXXFLAGS) -c -o $@ $<
$(CC) $(CXXFLAGS) -MM -MT $@ -MF $(patsubst %.o,%.d,%@) $<
这将生成所有内容,并将对象和依赖项文件放入我想要的构建目录中。但这会为<file>.o
目标创建两个依赖关系,一个来自-include
规则,并且具有所有标头依赖关系,另一个来自模式规则。这是否会被正确解释,即当标题被修改时,对象将通过为模式规则指定的命令重新编译?
编辑:所以这种方法确实很有效。我想我希望有人提供一个答案,让我能够深入了解make
在这些情况下的确切含义。例如,如果为同一目标的两个规则提供了不同的命令,该怎么办?我的猜测是它会出错,因为执行哪个命令并不明显。
答案 0 :(得分: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 $<
编辑:事实上这种做法确实如此 工作得很好。我想我想 有人提供答案 让我了解它是什么 确切地说,make就是这些 的情况。
我担心目前它只会偶然发挥作用(或者你没有从make文件中提供所有相关的部分)。请注意,您尚未表示.d
个文件与.cpp
个文件之间存在任何依赖关系。但是,这是必需的,以便您的.d
文件在包含之前更新作为make文件片段。
例如,如果a 两者都给出了不同的命令 同一目标的规则?我猜 因为它会导致错误 哪个命令不明显 执行。
使用该语法,它不会产生任何影响。但是在某些特殊情况下,将规则分为两个(尽管其他方面相同的规则)具有优点。我强烈建议您阅读本书"Managing Projects with GNU Make"以掌握使用GNU Make的各种方法。与GNU Make相关的唯一其他建议是阅读the paper here。
答案 1 :(得分:3)
是的,您可以为一个文件指定多个规则,然后将它们合并为一个。 请参阅GNU Make documentation。
[...]只能为文件执行一个配方。 [...] 只有先决条件的额外规则可用于一次为许多文件提供一些额外的先决条件。
我认为.d
文件应该有单独的规则。许多项目中的名称为deps
或depend
。
答案 2 :(得分:0)
POSIX 7 还表示给定目标工作的多行http://pubs.opengroup.org/onlinepubs/9699919799/
具有先决条件但没有任何命令的目标可用于添加到该目标的先决条件列表。任何给定目标只有一个目标规则可以包含命令。
只要只有一个人有命令。