自动生成依赖项

Automatic Dependency Generation

本文关键字:依赖 自动生成      更新时间:2023-10-16

我正在阅读制作手册中的自动依赖项生成,但我无法弄清楚为什么需要此功能。我正在从事的项目和我从头开始编写的项目结构如下:

  • 每个单元(库)都有自己的文件夹
  • 每个.cpp文件都应包含来自同一目录的具有相同名称的单个 .h 文件。好的,这个规则可能有点过于严格,就像在循环依赖的情况下一样,在这种情况下,我可能会包含另一个 .h 文件,就像下一个规则中所述
  • 在 .h 文件中包含其他标头时,如果依赖项位于另一个单元(库)中,请始终使用相对于项目根目录的路径。否则,只需包含文件名。

在生成文件中,我-I .传递给编译器。当它在目录 X 中遇到.cpp文件时,它将在同一目录(或.目录中)搜索 .h 文件。解析 .h 文件时,它会遇到相对于 . 文件夹的包含,因此它会知道在哪里查找它们。

现在,如果代码可以像我上面描述的那样结构化,为什么有人想要生成带有 -M 标志的依赖项列表并使用 sed 来生成一个晦涩的 .d 文件(依赖项 fie)?我看不出从代码文件生成特定的依赖项列表的意义。

因为在实践中,每个源文件都依赖于多个头文件。 如果每次更改任何标头时都不重新编译源文件,则很有可能最终会得到不一致的二进制文件。

这就是makepp的工作方式。 自动检测依赖项。 在您的情况下,您甚至不需要 makefile(如果您不介意在命令中指定目标)。

内置链接器规则具有自动推断对象文件的好处。 如果你说makepp proggie,它将扫描proggie.c(或.cpp或任何你拥有的)包含语句。 对于每个语句,它将查看是否有可以构建的匹配的 .o 文件,如果有,则递归扫描。 然后以这种方式发现的所有 .o 文件构建并链接在一起。

或者,您的生成文件可以是一行,以避免每次都指定目标:

$(phony all): proggie