1

ソースをバイナリ ファイルと 2 つの静的ライブラリにビルドする必要があります。以下に例を示します (簡潔にするために、レシピを「;」に置き換えました)。

objects := a.o b.o ...
.PHONY: all build build_lib
all: build build_lib
build: bin/app
build_lib: bin/libapp.a
bin/app: $(objects) ;
bin/libapp.a $(objects) ;
obj/%.o: %.cpp ;

並列ビルドに問題はありますか? 2 つの 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) ターゲットは、注文のみの前提条件の前に実行されないように見えますか、それとも出力を誤って読み取っていますか? とにかく、この変更が必要でしたか?

4

1 に答える 1