具有多个目录/模块依赖项的Makefile

具有多个目录/模块依赖项的Makefile,makefile,dependencies,Makefile,Dependencies,如果我正在创建一个包含多个子目录的项目,每个子目录对应一个特定模块,如A、B、C、D、E、F和可执行目标E1、E2、E3。每个模块对应于可执行目标使用的一个*.a。我的问题是如何生成模块和模块之间的依赖关系以及模块和可执行目标之间的依赖关系。也就是说,如果E1使用A的一个文件,那么E1应该依赖于A,因为我需要链接A.A来创建E1。 我应该如何设计Makefile来生成这种依赖关系?谢谢,我是Makefile的新手。我假设您正在使用GNU Make。您应该定义一个“罐装配方”,它封装了从库到可执行

如果我正在创建一个包含多个子目录的项目,每个子目录对应一个特定模块,如A、B、C、D、E、F和可执行目标E1、E2、E3。每个模块对应于可执行目标使用的一个*.a。我的问题是如何生成模块和模块之间的依赖关系以及模块和可执行目标之间的依赖关系。也就是说,如果E1使用A的一个文件,那么E1应该依赖于A,因为我需要链接A.A来创建E1。

我应该如何设计Makefile来生成这种依赖关系?谢谢,我是Makefile的新手。

我假设您正在使用GNU Make。您应该定义一个“罐装配方”,它封装了从库到可执行文件的过程。配方应使用“自动变量”,使其独立于特定文件。因为它只是一个配方,所以只需调试一次,然后就可以使用而不会出现进一步的错误

然后编写规则,明确说明目标库和先决条件库。因为它是如此明确,它是高度防错的。然后你用罐装食谱。如果你弄乱了先决条件,食谱会抱怨的

下面是一个例子

通常,除了库之外,您还有其他先决条件。例如,您应该始终使用makefile的列表。您可能还需要确保目标目录已创建。这就是为什么在下面的配方中,我使用了过滤器

对于此处未解释的所有术语,请参阅GNU Make手册

define recipe=
link $@ $(filter %.a, $^)
endef

E1: A.a (other prerequisites)
    $(recipe)

您是否在问如何为E1编写规则,以便a.a是E1的先决条件?是的,但我希望自动生成此规则,而不是自己编写,以防我在该依赖关系方面出错。可能吗?或者我只是想知道如何在包含多个lib和可执行文件的大型项目中编写makefile,其中每个可执行文件都依赖于一些lib。我认为手工编写这些依赖项时很容易出错。感谢这些依赖关系可以自动处理,但这很棘手。你用什么语言?您是否有一个合理的命名约定(例如,代码> A/A.A/COD>)?C++和C++。是,命名约定为A/A.A,同一文件夹或不同文件夹中的所有可执行目标都无关紧要。你能告诉我怎么处理吗?谢谢。。。