12

我正在学习makefile,我知道如何创建一个简单的makefile。我将继续使用嵌套的 makefile。这是我的目录结构

/src
...makefile
...main.cpp
...foo
......makefile
......foo.cpp
......foo.h

当调用 root makefile时,它​​会调用目录foo中的 makefile 。这是我的问题

  1. 我应该使用哪个makefile来编写链接所有目标文件的代码?如果它在根 makefile 中,我是否需要在那里指定所有目标文件名?
  2. 这是嵌套生成文件的最佳实践吗?还是只有一个根目录下的 makefile 好?

任何帮助都会很棒!

4

3 回答 3

18

这样做有很多话要说。阅读Recursive Make Considered Harmful。也是PDF 格式

简短的版本是递归 make 有效地构建了几个不相交但可能重叠的依赖树,并且不能保证正确或最大效率的构建。如果您希望并行构建,问题会变得更糟。

为了解决这个问题,你安排了一个单一的、非递归的 make 来构建一个单一的全跨依赖树,它允许 make 解决上述所有问题。

非递归构造的示例结构和编写它们时出现的几个棘手问题的解决方案可以在原始论文和以下答案中找到:

于 2009-04-07T03:46:14.663 回答
3

递归 make 通常被认为是有害的。

如果您真的希望能够在根目录中键入“make”并让它仅使用 POSIX makefile 构建所有内容,那么这是唯一的方法。在这种情况下,将子项目链接到它们自己的目录中,并将最终的东西放在根目录中。

如果您愿意使用 gmake 语法,请查看此处的 Makefile:http: //github.com/singpolyma/theveeb-ecosystem

于 2009-04-07T03:48:02.817 回答
2

有更现代的构建系统,例如SCons,它们的语法比 make 更简单,并且避免了许多 make 的陷阱。例如 SCons 扫描源文件以确定它自己的依赖关系,而对于 make 需要手动指定依赖关系。例如,如果你在一个实现文件中添加一个新的#include 语句,那么如果头发生变化,make 将不会重新编译那个实现文件(除非你添加了新的依赖项)。SCons 将自动检测新的依赖项并重新编译任何必要的内容。

于 2009-04-07T04:02:37.697 回答