2013-06-21 34 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有两个目标,一个没有收据行。