【问题标题】:Automatic Dependency Generation自动依赖生成
【发布时间】:2012-07-06 10:25:08
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ gcc compilation makefile dependencies


    【解决方案1】:

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

    【讨论】:

    • 哦,对了……我明白了。但是在编译 .cpp 文件之前不检查整个依赖树的变化吗?
    • @MihaiTodor:Make 无法确定您的依赖项是什么。 Make 所能做的就是根据依赖关系的变化确定是否需要重新运行规则。您可以为它提供每个目标的依赖项列表。
    • make 只会查看目标文件的时间戳,并将其与依赖文件的时间戳进行比较。
    【解决方案2】:

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

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

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

    $(phony all): proggie
    

    【讨论】:

    • 感谢您的建议,但目前我会坚持使用 make。
    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 2021-01-12
    相关资源
    最近更新 更多