创建嵌套的makefile

创建嵌套的makefile,makefile,nested,Makefile,Nested,我正在学习makefile,我知道如何创建一个简单的makefile。我将继续讨论嵌套的makefile。这是我的目录结构 /src ...makefile ...main.cpp ...foo ......makefile ......foo.cpp ......foo.h 当调用根makefile时,它调用目录foo中的makefile。以下是我的问题 我应该使用哪个makefile来编写链接所有对象文件的代码?如果它在根makefile中,是否需要在那里指定所有对象文件名 这是嵌套mak

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

/src
...makefile
...main.cpp
...foo
......makefile
......foo.cpp
......foo.h
当调用根makefile时,它调用目录foo中的makefile。以下是我的问题

  • 我应该使用哪个makefile来编写链接所有对象文件的代码?如果它在根makefile中,是否需要在那里指定所有对象文件名
  • 这是嵌套makefiles的最佳实践吗?或者只有一个根目录下的makefile好吗

  • 任何帮助都会很好

    不这样做有很多话要说。阅读也在

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

    为了解决这个问题,您需要安排一个单一的、非递归的make来构建一个单一的、全生成的依赖关系树,该树允许make解决上述所有问题

    非递归make的示例结构以及在编写过程中出现的几个棘手问题的解决方案可在原始论文和以下内容的答案中找到:


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

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


    如果您愿意使用gmake语法,请查看此处的makefile:

    像这样的现代构建系统比make更容易使用语法,并且避免了make的许多缺陷。例如,SCons扫描源文件以确定其自身的依赖关系,而对于make,则需要手动指定依赖关系。例如,如果向实现文件中添加新的#include语句,则如果标头发生更改,make将不会重新编译该实现文件(除非添加新的依赖项)。SCON将自动检测新的依赖项,并根据需要重新编译。

    您可以使用POSIX(非GNU)make执行非递归构建,方法是将其分为两步:1)连接所有子目录中的所有make.inc文件;2) 运行生成的makefile。但是大多数人还是使用GNU make,它有“include”指令。啊,这是真的,我从来没有想到过连接黑客。我倾向于使用include。通常我希望非常POSIX,但对于makefiles,有时会有点毛茸茸的,因为no include指令:)如果不这样做是个坏主意,也许应该建议替代解决方案作为答案。是的。该答案的形式在现场已不再可接受。这些编辑只是部分修复了缺陷,但它确实是一件好事。