2013-06-21 62 views
0

有沒有人可以幫助我理解爲什麼GNU make會在下面的例子中考慮「循環依賴」。如果未指定VPATH並且源文件在當前目錄中顯示,則一切正常。GNU make:指定VPATH時的循環依賴關係

$ cat Makefile 
VPATH = src 

src%.o: %.cpp 
     @echo ECHO: [email protected]: $< 

lib%.o: %.cpp 
     @echo ECHO: [email protected]: $< 

dll%.so: %.cpp 
     @echo ECHO: [email protected]: $< 

lib%.so: lib%.o dll%.so 
     @echo ECHO: [email protected]: $< 

A.exe: libA.so 

%.exe: src%.o 
     @echo ECHO: [email protected]: $< 

$ 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 

謝謝,亞歷克斯

回答

0

這不是一個真正的解決方案,只是不同的解決方法。我沒有找到問題的根源。

情況#1 src/A.cpp存在,MAKEFILE一點點修改:

#!/usr/bin/make -f 

VPATH = src 

src%.o: %.cpp 
     @echo ECHO_1: [email protected]: $<, 

lib%.o: %.cpp 
     @echo ECHO_2: [email protected]: $<, 

dll%.so: %.cpp 
     @echo ECHO_3: [email protected]: $<, 

lib%.so: lib%.o dll%.so 
     @echo ECHO_4: [email protected]: $<, 

A.exe: libA.so 
#  @echo ECHO_45: [email protected]: $<, 

%.exe: src%.o 
     @echo ECHO_5: [email protected]: $<, 

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: [email protected]: $<,

輸出:

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, 

情況#4修改lib%.so: lib%.o dll%.solib%.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打印關於完成的詳細信息,但我無法獲得最終結果。看起來問題是因爲A.exe有兩個目標,一個沒有收據行。