在Makefile中解决依赖关系的常用方法是什么?

时间:2012-06-01 16:16:13

标签: c++ c makefile

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

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

PS:C / CPP项目。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

这个答案假设您只是一般性地询问,而您还不知道在出发时需要解决哪些具体问题。

修改

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

autoconf处理第三方库,工具或系统功能的可选或替代依赖项。 automake提供了macros,其中一些偶尔会有用,即使您使用autoconf而没有automake

直接从automake开始的附带好处是,您的makefile将完全可预测(在约定和可移植性方面),而且注意力较少。

因此我的谦虚建议。

答案 2 :(得分:0)

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

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

我曾经做过performance comparison几个这样的选项。

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