0

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

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

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

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

4

2 回答 2

4

因为在实践中,每个源文件都会依赖多个头文件。如果每次这些标头发生更改时您都没有重新编译源文件,那么您很有可能会得到一个不一致的二进制文件。

于 2012-07-06T00:03:28.227 回答
1

这就是makepp的工作原理。自动检测依赖关系。在您的情况下,您甚至不需要生成文件(如果您不介意在命令中指定目标)。

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

或者你的makefile可以是一个单行,以避免每次都指定目标:

$(phony all): proggie
于 2012-07-08T15:55:48.540 回答