使用Makefile,源生成器和使用gcc生成依赖项

时间:2014-09-25 16:28:07

标签: c++ gcc makefile g++

在项目中我有:

  • 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):

  1. 指令生成.d文件无效,因为gen.h缺失: fatal error: gen.h: No such file or directory include "gen.h"
  2. 即使这些说明有效,我的工作流程也会出现问题"。直到现在我可以为下一个make生成.d文件。它起作用了,因为添加新的依赖项需要更改当前的依赖项之一。因此,在添加一个.o后重建并生成新的.d。现在我需要在制作.o之前检测到这一点,我需要从gen.h生成template.sth
  3. 有没有办法自动完成?问题1.如果有某种方法可以告诉g++如果某个.h文件丢失,它可以将其添加到依赖项中。 解决问题后1.执行make多次(我认为两次总是足够)最终得到内置项目(第一个make将生成依赖项文件,然后第二个make看到main.cpp依赖于gen.hgen.h缺失,并且有说明如何创建gen.h,以便在构建gen.h之前创建main.o

    如果不能以某种方式自动完成,怎么解决?我可以写入Makefile指令,这些指令将构建所有生成的文件,或者我需要在所有.o指令中手动添加此生成的文件作为依赖项吗?

    更新

    经过少量更改后,即使-MGg++标记gen.h也会生成正确的文件。我现在可以使用两个make命令构建我的项目。 第一个将创建正确的.d文件并中断,因为gen.h缺失。 第二个文件已准备好.d个文件,因此在构建gen.h之前会生成main.o,因此构建main.o将会成功。

    在生成.d之前,有没有办法生成.o文件然后再使用它?

1 个答案:

答案 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文件,然后重新读取它们并重新计算所有依赖项,然后再尝试构建其他任何依赖项。