使用Makefile、源生成器和gcc生成依赖关系

Working with Makefile, source generators and generating dependencies with gcc

本文关键字:gcc 依赖 关系 Makefile 使用      更新时间:2023-10-16

在项目中,我有:

  • 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.hfatal error: gen.h: No such file or directory include "gen.h"
  2. 即使这些说明有效,我的"工作流程"也有问题。到目前为止,我可以为下一次制作生成.d文件。它起作用了,因为添加新的依赖项需要更改当前的一个依赖项。因此,在添加一个CCD_ 18之后进行重建,并生成新的CCD_ 19。现在我需要检测到,在制作.o之前,我需要从template.sth生成gen.h

有什么方法可以自动完成吗?问题1。如果有某种方法告诉CCD_ 23,如果某个CCD_。解决问题1。多次执行make(我认为两次总是足够的)最终会生成项目(第一个make会生成依赖文件,然后第二个make看到main.cpp依赖于gen.hgen.h缺失,并且有关于如何创建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文件并使用它?

您需要为生成的文件添加依赖项:

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