【问题标题】:GNU make - enforcing target orderGNU make - 执行目标顺序
【发布时间】:2019-02-17 17:31:05
【问题描述】:

有人可以告诉我是否有办法强制特定 Makefile 目标的顺序执行。例如,我有一个构建库和可执行文件的 Makefile。现在,可执行文件依赖于库,因此它们必须在库构建和暂存之后构建。这是我目前在单个 Makefile 中的内容:

.PHONY: all
all: all_lib all_bin

.PHONY: all_lib
all_lib: $(dep_lib)

.PHONY: all_bin
all_bin: $(dep_bin)

我有两个目标all_liball_bin,一个构建所有库,另一个构建所有二进制可执行文件。当我通过-j make 运行并行作业时,我得到构建失败,因为所有目标并行运行并且二进制文件找不到共享库对象和暂存的头文件。

我尝试将其更改为此以尝试强制一些依赖顺序:

.PHONY: all
all: all_bin

.PHONY: all_lib
all_lib: $(dep_lib)

.PHONY: all_bin
all_bin: all_lib $(dep_bin)

但由于某种原因,所有目标仍然并行运行,我仍然遇到相同的构建失败。有什么想法吗?

【问题讨论】:

标签: makefile


【解决方案1】:

Make 完全围绕依赖的概念构建。你根本就没有那样使用它。

如果一个可执行文件依赖于一个库,那么您应该在可执行文件的先决条件列表中列出该库。我不能给你一个相关的例子,因为你没有提供关于上面dep_libdep_bin的内容的任何细节,但是例如:

exe1 : exe1.o liblib1.a liblib2.a

等等。现在,exe1 在创建 liblib1.aliblib2.a 目标之前不会尝试链接。

【讨论】:

  • 好的,谢谢您的建议,我现在知道了。刚刚意识到,解决此问题的另一种方法是对每个 all_liball_bin 目标运行递归 make。
  • 嗯,有很多方法可以解决它。有些在概念层面上更“正确”。在编写只需要澄清这样的依赖关系的 makefile 时,递归 make 不会被认为是最佳实践(尽管与某些纯粹主义者不同,我相信递归 make 有它的位置,并且在 some i> 情况)。但是,如果它有效,并且您理解它,那总比无效或您不理解的东西要好,即使它不是最类似于 make 的方法。
猜你喜欢
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 2020-06-05
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多