Parallel processing 平行制造:两个目标依赖于相同的前提,会发生什么?

Parallel processing 平行制造:两个目标依赖于相同的前提,会发生什么?,parallel-processing,makefile,Parallel Processing,Makefile,我需要构建二进制文件和两个静态库的源代码。 下面是一个例子(为了简洁起见,我用“;”替换了食谱): 并行构建会有问题吗?两个make进程是否可以尝试同时重建相同的*.o文件,从而生成一个损坏的生成 我猜,他们可以,所以我用这种方式重写了代码: objects := a.o b.o ... .PHONY: all build build_lib all: $(objects) | bin/app bin/libapp.a build: bin/app build_lib: bin/libapp.a

我需要构建二进制文件和两个静态库的源代码。 下面是一个例子(为了简洁起见,我用“;”替换了食谱):

并行构建会有问题吗?两个make进程是否可以尝试同时重建相同的*.o文件,从而生成一个损坏的生成

我猜,他们可以,所以我用这种方式重写了代码:

objects := a.o b.o ...
.PHONY: all build build_lib
all: $(objects) | bin/app bin/libapp.a
build: bin/app
build_lib: bin/libapp.a
bin/app: $(objects) ;
bin/libapp.a $(objects) ;
obj/%.o: %.cpp ;
但是--debug=b输出仍然显示:

Processing target file `all'.
 File `all' does not exist.
  Processing target file `bin/app'.
   File `bin/app' does not exist.
    Processing target file `obj/client.o'.
    Need to rebuild target `obj/client.o'.
...
 File `sb_all' does not exist.
   File `bin/app' does not exist.
   File `bin/libapp.a' does not exist.
 File `sb_all' does not exist.
   File `bin/app' does not exist.
   File `bin/libapp.a' does not exist.
...
  Need to rebuild target `bin/app'.
g++  -lgd ...
  Need to rebuild target `bin/libapp.a'.
ar ...
File `all' does not exist.
Target file `all' rebuilt successfully.

所以,我的$(objects)目标似乎没有在order only先决条件之前运行,或者我是否错误地读取了输出?我还需要这个零钱吗?

不,没有问题。Make在并行性和多个目标(在Make的同一实例中)方面不会有任何问题,这取决于相同的先决条件。如果您有make的递归实例,并且有多个不同的make实例尝试构建同一个目标,那么您将遇到问题

仅顺序对并行性没有任何影响。Make仍将在可能的情况下并行调用事物。影响规则运行顺序的唯一方法是声明这些目标之间的先决条件关系。这里您只是说两个更高级别的目标都必须在
all
目标之前构建,所以这不会降低并行性


幸运的是,正如我上面所说,你不必这么做。只要您的makefile正确定义了任意两个目标之间的依赖关系,make就可以处理更大的问题。

非常感谢,MadScientist。
Processing target file `all'.
 File `all' does not exist.
  Processing target file `bin/app'.
   File `bin/app' does not exist.
    Processing target file `obj/client.o'.
    Need to rebuild target `obj/client.o'.
...
 File `sb_all' does not exist.
   File `bin/app' does not exist.
   File `bin/libapp.a' does not exist.
 File `sb_all' does not exist.
   File `bin/app' does not exist.
   File `bin/libapp.a' does not exist.
...
  Need to rebuild target `bin/app'.
g++  -lgd ...
  Need to rebuild target `bin/libapp.a'.
ar ...
File `all' does not exist.
Target file `all' rebuilt successfully.