Makefile GNU make-强制执行目标命令

Makefile GNU make-强制执行目标命令,makefile,Makefile,有人能告诉我,是否有一种方法可以强制执行特定Makefile目标的顺序执行。例如,我有一个生成库和可执行文件的Makefile。现在,可执行文件依赖于库,因此它们必须在构建和暂存库之后构建。这是我当前在单个Makefile中拥有的内容: .PHONY: all all: all_lib all_bin .PHONY: all_lib all_lib: $(dep_lib) .PHONY: all_bin all_bin: $(dep_bin) 我有两个目标,一个构建所有库,另一个构建所有二

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

.PHONY: all
all: all_lib all_bin

.PHONY: all_lib
all_lib: $(dep_lib)

.PHONY: all_bin
all_bin: $(dep_bin)
我有两个目标,一个构建所有库,另一个构建所有二进制可执行文件。当我传递
-j
以使其运行并行作业时,生成失败,因为所有目标并行运行,二进制文件找不到共享库对象和暂存头文件

我尝试将其更改为此,以尝试强制执行某些依赖顺序:

.PHONY: all
all: all_bin

.PHONY: all_lib
all_lib: $(dep_lib)

.PHONY: all_bin
all_bin: all_lib $(dep_bin)

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

Make完全是围绕依赖性的概念构建的。你根本不是那样使用它

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

exe1 : exe1.o liblib1.a liblib2.a

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

请参阅。好的,谢谢您的建议,我现在就知道了。刚刚意识到,解决这一问题的另一种方法是对每个
all_lib
目标运行递归make,然后对
all_bin
目标运行递归make。有些在概念层面上更“正确”。当编写只需要澄清这种依赖关系的makefile时,递归make不会被视为最佳实践(尽管与一些纯粹主义者不同,我相信递归make有它的位置,在某些情况下是一个有用且强大的工具)。但是如果它有效,并且你理解它,那就比不起作用或者你不理解的东西要好,即使它不是最像制造的方法。