2012-07-05 78 views
0

我正在通过Automatic Dependency Generationmake manual阅读,我不明白为什么需要此功能。该项目是我的工作,我开始从头开始编写的结构是这样的:自动依赖生成

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

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

现在,如果代码可以像我上面描述的那样构造,那么为什么有人要生成-M标志的依赖关系列表,并将sed混乱以产生一个难以理解的.d文件(依赖关系)?我没有看到从代码文件生成特定的依赖关系列表。

回答

4

因为实际上,每个源文件都依赖于多个头文件。如果每次更改任何这些头文件时都不重新编译源文件,那么很可能最终会得到不一致的二进制文件。

+0

哦,对了......我明白了。但在编译.cpp文件之前,不会检查整个依赖关系树的更改吗? – 2012-07-06 00:11:17

+1

@MihaiTodor:Make不知道你的依赖是什么。所有Make可以做的是找出是否需要根据依赖关系的变化重新运行规则。您需要为其提供每个目标的依赖列表。 – 2012-07-06 00:13:21

+0

你说得对。现在我明白了。非常感谢你! – 2012-07-06 00:19:33

1

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

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

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

$(phony all): proggie 
+0

感谢您的建议,但目前,我会坚持使用。 – 2012-07-08 19:49:10