gpt4 book ai didi

c++ - 使用 Makefile、源代码生成器并使用 gcc 生成依赖项

转载 作者:太空宇宙 更新时间:2023-11-04 13:45:49 25 4
gpt4 key购买 nike

在我的项目中:

  • 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:没有那个文件或目录 include "gen.h"
  2. 即使这些说明可行,我的“工作流程”也存在问题。直到现在我可以为下一个 make 生成 .d 文件。它起作用了,因为添加新的依赖项需要更改当前的依赖项之一。所以在添加一个 .o 后重建并生成新的 .d。现在我需要在制作 .o 之前检测到我需要从 template.sth 生成 gen.h

有什么办法可以自动完成吗?问题 1. 如果有某种方法可以告诉 g++ 如果某些 .h 文件丢失,它可以将其添加到依赖项中,则问题 1 可以得到解决。解决问题 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 会成功。

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

最佳答案

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

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

关于c++ - 使用 Makefile、源代码生成器并使用 gcc 生成依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26043592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com