![](/img/trans.png)
[英]How to write a common rule in Makefile for multiple target dependency pairs
[英]Makefile multiple dependency lines for a single target?
要生成依赖文件,我可以使用类似这样的东西来生成依赖文件:
-include $(patsubst %.cpp,build/%.d,$(SRC))
build/%.o: %.cpp
$(CC) $(CXXFLAGS) -c -o $@ $<
$(CC) $(CXXFLAGS) -MM -MT $@ -MF $(patsubst %.o,%.d,%@) $<
这会生成所有内容并将 object 和依赖文件放入我想要的构建目录中。 但这为<file>.o
目标创建了两条依赖线,一条来自-include
规则和所有 header 依赖关系,一条来自模式规则。 这是否会得到正确解释,即当修改 header 时,将通过为模式规则指定的命令重新编译 object?
编辑:所以这种方法实际上效果很好。 我想我希望有人能提供一个答案,让我深入了解make
在这些情况下究竟做了什么。 例如,如果对同一目标的两条规则给出不同的命令怎么办? 我的猜测是它会给出一个错误,因为执行哪个命令并不明显。
您应该再添加一个模式规则来表达.cpp
和.d
文件之间的依赖关系,并使用该规则来创建.d
文件(您问题的模式规则中的第二行),而不是无条件地创建.d
文件。 如果 header 或源文件发生更改,则在所有.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 文件片段之前得到更新。
例如,如果对同一目标的两条规则给出不同的命令怎么办? 我的猜测是它会给出一个错误,因为执行哪个命令并不明显。
使用这种语法,它不会有所作为。 但是在某些特殊情况下,将规则一分为二(尽管其他规则相同)是有好处的。 我强烈建议您阅读“使用 GNU Make 管理项目”一书,以掌握使用 GNU Make 的各种方式。 与 GNU Make 相关的唯一其他建议是阅读此处的论文。
是的,您可以为一个文件指定多个规则,并将它们合并为一个。 请参阅GNU Make 文档。
[...] 一个文件只能执行一个配方。 [...] 一个只有先决条件的额外规则可用于一次为许多文件提供一些额外的先决条件。
我认为.d
文件应该有单独的规则。 它在许多项目中的名称是deps
或depend
。
POSIX 7还表示给定目标的多行工作http://pubs.opengroup.org/onlinepubs/9699919799/
具有先决条件但没有任何命令的目标可用于添加到该目标的先决条件列表。 任何给定目标只有一个目标规则可以包含命令。
只要只有一个人有命令。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.