【发布时间】:2014-09-25 16:28:07
【问题描述】:
在我的项目中:
main.cpptemplate.sth- 更多
对于每个.cpp 文件,我正在生成.o 文件。
多亏了这一点,我可以为所有 .o 目标编写简单的规则(为了更清晰,简化了一点伪代码版本):
OBJS = #list of all .o files needed
%.o: %.cpp
g++ -MM -MF %.d -MP -MT %.o %.cpp
g++ -c -o %.o %.cpp
然后我包含所有现有的.d 文件,因此在每一代之后我都会刷新依赖项。
除非我有template.sth,否则它会起作用。该文件包含一些用于生成h 文件和cpp 文件的模板。
当一个文件,即main.cpp 包含从template.sth 生成的文件时(比如说gen.h):
- 生成
.d文件的指令不起作用,因为缺少gen.h:fatal error: gen.h: No such file or directoryinclude "gen.h" - 即使这些说明可行,我的“工作流程”也有问题。到目前为止,我可以为下一次制作生成
.d文件。它起作用了,因为添加新的依赖项需要更改当前的依赖项之一。因此,在添加一个.o后正在重建并生成新的.d。现在我需要在制作.o之前检测到我需要从template.sth生成gen.h。
有什么办法可以自动完成吗?问题 1. 如果有某种方法可以告诉 g++ 如果缺少某些 .h 文件,则可以将其添加到依赖项中。
解决问题 1. 多次执行 make(我认为两次就足够了)以构建项目结束(第一个 make 会生成依赖文件,然后第二个 make 看到 main.cpp 依赖于 gen.h,@987654350 @ 缺失,并且有说明如何创建 gen.h,因此它将在构建 main.o 之前创建 gen.h。
如果不能以某种方式自动完成,如何解决?我可以在Makefile 指令中编写将在任何其他文件之前构建所有生成的文件,还是我需要手动将此生成的文件添加为所有.o 指令中的依赖项?
更新:
经过一些更改,-MG 标志 g++ 甚至为 gen.h 生成正确的文件。我现在可以使用两个make 命令构建我的项目。
第一个将创建正确的.d 文件并中断,因为缺少gen.h。
第二个将准备好.d文件,因此它会在构建main.o之前生成gen.h,因此构建main.o会成功。
有没有办法在生成.o之前生成.d文件然后使用它?
【问题讨论】: