【问题标题】:Makefile with Multiple Directories/Module Dependency具有多个目录/模块依赖的 Makefile
【发布时间】:2013-10-14 12:09:37
【问题描述】:

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

【问题讨论】:

  • 您是在问如何为 E1 编写规则,使 A.a 成为 E1 的先决条件?
  • 是的,但我希望自动生成此规则,而不是自己编写,以防我对该依赖项出错。那可能吗?或者我只是想知道如何在包含多个库和可执行文件的大型项目中编写 Makefile,其中每个可执行文件都依赖于一些库。我认为手工编写这些依赖项时容易出错。谢谢
  • 这些依赖可以自动处理,但是比较麻烦。您使用什么语言?你有一个合理的命名约定(例如A/A.a)吗?
  • c 和 c++。是的,命名约定是 A/A.a,同一文件夹或不同文件夹中的所有可执行目标都无关紧要。你能告诉我如何处理吗?非常感谢...

标签: makefile dependencies


【解决方案1】:

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

然后,您可以在明确声明目标库和必备库的地方编写规则。因为它是如此明确,所以它是高度防错的。然后你使用罐头食谱。如果你搞砸了先决条件行,配方会报错。

下面是一个例子。

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

请查阅 GNU Make 手册以了解此处未解释的所有术语。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    相关资源
    最近更新 更多