【问题标题】:What's the common way to resolve dependencies in Makefile?在 Makefile 中解决依赖关系的常用方法是什么?
【发布时间】:2012-06-06 01:58:06
【问题描述】:

我见过很多方法用于解决 Makefile 中的依赖关系,例如使用 gcc -MMsed commond,或使用 include 指令(加上一点 Perl 魔法),或 qmake ,或automake,或info make

面对如此多的选择,我很困惑我应该选择哪一个。那么,我想知道现在解决 Makefile 中依赖项的常用方法是什么?解决这个问题的最佳方法是什么?

PS:C/CPP 项目。

【问题讨论】:

  • 视情况而定,您能否解释一下您的makefile问题,以便我们更好地帮助您?
  • 这也可能取决于您需要支持的平台(您需要的便携性)。
  • @pyCthon 实际上,问题是简单的依赖问题。如对头文件进行了修改,重新运行make命令只会重新生成对应的目标文件。我想知道的是bestcommon 解决此问题的方法。谢谢。
  • @Jirka Hanika 如果只想在 Linux 上部署我的项目怎么办?
  • @injoy 总是包含一个干净的选项是一个简单的提示

标签: c++ c makefile


【解决方案1】:

一般而言,如果您只关心支持 GNU make 和 gcc 的系统(例如所有 linux 变体和当今大多数类似 unix 的系统),您只需使用 gcc 的各种 -M 标志来生成依赖项,然后使用 -include它们在你的 Makefile 中。 in this question 有一些很好的信息——通常不需要使用 sed 或任何更复杂的工具。

【讨论】:

    【解决方案2】:

    如果您只需要支持许多 Linux 发行版(正如您在评论中指出的那样),那么我建议您使用 automake/autoconf 套件。

    此答案假定您只是一般性地询问,并且您还不知道在进行过程中您必须解决哪些具体问题。

    编辑

    GNU make 可以单独处理您自己项目中的依赖生成。

    autoconf 处理对第三方库、工具或系统功能的可选或替代依赖项。 automake 提供了macros,即使您在不使用automake 的情况下使用autoconf,其中一些有时也会有用。

    直接从automake 开始的另一个好处是,您的makefile 的行为完全可以预测(在约定和可移植性方面),而且投入更少。

    因此我的谦虚建议。

    【讨论】:

    • automake/autoconf 只有在您需要支持非 linux 系统时才真正需要。如果你只关心 Linux,那就使用 GNUmake
    • @ChrisDodd - 为您的回答 +1。既然您帮助我更好地理解了这个问题的重点,我扩展了我的答案。我怀疑我的可能是基于有些过时的个人经验,但我会让社区来判断。
    【解决方案3】:

    有几种方法可以为 C/C++ 项目生成兼容的依赖项:

    • gcc -M,它有多种风格,在准确性方面有点“黄金标准”,因为它使用实际的编译器来生成依赖关系,而且谁会比编译器本身更了解如何处理 #include 语句?
    • makedepend,通常不鼓励使用编译器生成的依赖项。
    • fastdep,另一个第三方依赖生成器,声称比 gcc -M 更快。
    • ElectricAccelerator 有一个名为 autodep 的内置功能,它使用构建中调​​用的命令的文件系统使用活动来生成依赖关系信息。 autodep 相对于其他替代方案的优势在于它非常快速且完全独立于工具和编程语言——而其他都与 C/C++ 相关联或需要使用特定的编译器,autodep 可与所有类型的构建工具一起使用。

    不久前我对其中几个选项做了performance comparison

    免责声明:我是 ElectricAccelerator 的架构师和首席开发人员。

    【讨论】:

      猜你喜欢
      • 2014-10-29
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 2023-03-13
      • 1970-01-01
      • 2010-12-07
      相关资源
      最近更新 更多