自动依赖生成

时间:2012-07-05 23:51:17

标签: c++ gcc compilation makefile dependencies

我正在阅读Automatic Dependency Generation中的make manual,我无法弄清楚为什么需要此功能。我正在开展的项目和我从头开始编写的结构如下:

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

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

现在,为什么有人想要生成一个带有-M标志的依赖项列表,并且如果代码可以像我上面描述的那样构造,那么就会产生一个模糊的.d文件(依赖项fie)。我没有看到从代码文件生成特定依赖项列表的重点。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

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

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

$(phony all): proggie