在项目中我有:
main.cpp
template.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 directory
include "gen.h"
.d
文件。它起作用了,因为添加新的依赖项需要更改当前的依赖项之一。因此,在添加一个.o
后重建并生成新的.d
。现在我需要在制作.o
之前检测到这一点,我需要从gen.h
生成template.sth
。有没有办法自动完成?问题1.如果有某种方法可以告诉g++
如果某个.h
文件丢失,它可以将其添加到依赖项中。
解决问题后1.执行make多次(我认为两次总是足够)最终得到内置项目(第一个make
将生成依赖项文件,然后第二个make
看到main.cpp
依赖于gen.h
,gen.h
缺失,并且有说明如何创建gen.h
,以便在构建gen.h
之前创建main.o
。
如果不能以某种方式自动完成,怎么解决?我可以写入Makefile
指令,这些指令将构建所有生成的文件,或者我需要在所有.o
指令中手动添加此生成的文件作为依赖项吗?
更新
经过少量更改后,即使-MG
,g++
标记gen.h
也会生成正确的文件。我现在可以使用两个make
命令构建我的项目。
第一个将创建正确的.d
文件并中断,因为gen.h
缺失。
第二个文件已准备好.d
个文件,因此在构建gen.h
之前会生成main.o
,因此构建main.o
将会成功。
在生成.d
之前,有没有办法生成.o
文件然后再使用它?
答案 0 :(得分:0)
您需要为生成的文件添加依赖项:
gen.h: template.sth
...command to create gen.h from template.sth
如果你有很多生成的文件,你可能想要一种自动创建这些依赖项的方法,这取决于你如何生成它们。
此外,您希望独立于.o文件生成.d文件,并使用-MG
标志生成它们以忽略丢失的文件:
%.d: %.cpp
g++ -MM -MF $@ -MP -MG $<
-include $(OBJS:.o=.d)
这样,第一次运行make时,它将生成带有依赖项的.d
文件,然后重新读取它们并重新计算所有依赖项,然后再尝试构建其他任何依赖项。