2012-06-01 30 views
4

我见过很多的方法被用来解决在Makefile中的依赖关系,如使用gcc -MMsed commond,或使用include指令(再加上一点点的Perl魔术),或qmake,或者automake,或info make等。解决Makefile中的依赖问题的常用方法是什么?

面对如此多的选择,我很困惑应该选择哪一个。所以,我想知道现在如何解决Makefile中的依赖问题?处理这个问题的最好方法是什么?

PS:C/CPP项目。

+0

这取决于情况,你可能会解释一下你的makefile问题,这样我们可以更好地帮助你吗? – pyCthon

+0

它也可能取决于你需要支持哪些平台(你需要如何移植)。 –

+0

@pyCthon其实,问题很简单,依赖问题。如对头文件进行修改,重新运行'make'命令只会重新生成相应的目标文件。我想知道的是解决这个问题的“最佳”或“常用”方法。谢谢。 – injoy

回答

1

一般来说,如果你关心的是支持GNU使和gcc(如所有的Linux版本和大多数UNIX类系统,这些天),你只需要使用gcc的各种-M标志产生依赖系统,然后-include他们在您的Makefile文件。有一些很好的信息in this question - 通常不需要使用sed或更复杂的工具。

+0

感谢您的提示:-) – injoy

0

如果你只需要支持大量的Linux发行版(正如你在评论中提到的那样),那么我会推荐automake/autoconf套件。

这个答案假设你只是普遍问,而你还不知道在你走的时候你需要解决哪些具体问题。

编辑

GNU使单独可以在自己的项目中处理依存产生。

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

直接从automake开始的一个好处是,您的makefile文件的行为完全可预测(在约定和便携性方面),投资少。

因此,我谦卑的建议。

+0

automake/autoconf实际上只在需要支持非Linux系统时才需要。如果你关心的只是Linux,只需使用GNUmake –

+0

非常感谢! – injoy

+0

@ChrisDodd - +1给你的答案。现在我扩大了我的答案,您已经帮助我更好地理解这个问题的重点。我怀疑我的观点可能是基于某种过时的个人经历,但我会让社区判断。 –

0

有几种方法来生成化妆兼容依赖于C/C++项目:

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

我做了performance comparison几个这些选项,而回来。

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