0

次の例でGNU makeが「循環依存」を考慮する理由を理解するのを手伝ってくれる人はいますか? VPATH が指定されておらず、ソース ファイルが現在のディレクトリに存在する場合、すべて問題ありません。

$ cat Makefile
VPATH = src

src%.o: %.cpp
        @echo ECHO: $@: $<

lib%.o: %.cpp
        @echo ECHO: $@: $<

dll%.so: %.cpp
        @echo ECHO: $@: $<

lib%.so: lib%.o dll%.so
        @echo ECHO: $@: $<

A.exe: libA.so

%.exe: src%.o
        @echo ECHO: $@: $<

$ make
make: Circular dllA.so <- A.cpp dependency dropped.
ECHO: libA.o: src/A.cpp
ECHO: dllA.so:
ECHO: libA.so: libA.o
ECHO: srcA.o: src/A.cpp
ECHO: A.exe: srcA.o

ありがとう、アレックス

4

2 に答える 2

0

これは実際の解決策ではなく、さまざまな回避策です。問題の根本を見つけられませんでした。

ケース #1src/A.cppが存在し、makefile が少し変更されています。

#!/usr/bin/make -f

VPATH = src

src%.o: %.cpp
        @echo ECHO_1: $@: $<,

lib%.o: %.cpp
        @echo ECHO_2: $@: $<,

dll%.so: %.cpp
        @echo ECHO_3: $@: $<,

lib%.so: lib%.o dll%.so
        @echo ECHO_4: $@: $<,

A.exe: libA.so
#       @echo ECHO_45: $@: $<,

%.exe: src%.o
        @echo ECHO_5: $@: $<,

yy.mak: ;

出力にエラーが含まれています

make: Circular dllA.so <- A.cpp dependency dropped.
ECHO_2: libA.o: src/A.cpp,
ECHO_3: dllA.so: ,
ECHO_4: libA.so: libA.o,
ECHO_1: srcA.o: src/A.cpp,
ECHO_5: A.exe: srcA.o,

ケース #2 ./A.cpp が存在し、VPATH がコメント化されています。

出力 (エラーなし):

ECHO_2: libA.o: A.cpp,
ECHO_3: dllA.so: A.cpp,
ECHO_4: libA.so: libA.o,
ECHO_1: srcA.o: A.cpp,
ECHO_5: A.exe: srcA.o,

ケース #3 VPATH がコード内にあり、@echo ECHO_45: $@: $<,行のコメントを解除している

出力:

ECHO_2: libA.o: src/A.cpp,
ECHO_3: dllA.so: src/A.cpp,
ECHO_4: libA.so: libA.o,
ECHO_45: A.exe: libA.so,

ケース #4lib%.so: lib%.o dll%.soとして変更するため、依存関係からlib%.so: lib%.o #dll%.so削除します。dllA.so

出力 (エラーなし):

ECHO_2: libA.o: src/A.cpp,
ECHO_4: libA.so: libA.o,
ECHO_1: srcA.o: src/A.cpp,
ECHO_5: A.exe: srcA.o,

make -d何が行われたかについての詳細な情報を印刷するために使用しようとしましたが、最終結果を得ることができませんでした。問題は、ターゲットが 2 つA.exeあり、1 つに領収書がないことが原因のようです。

于 2013-06-22T22:21:21.170 に答える