GNU make:指定VPATH时的循环依赖关系

时间:2013-06-21 15:22:05

标签: makefile gnu-make circular-dependency vpath

在下面的例子中,是否有人可以帮助我理解为什么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

谢谢你,Alex

2 个答案:

答案 0 :(得分:1)

这看起来像a known bug in GNUMake,已在版本3.82中修复。

答案 1 :(得分:0)

这不是一个真正的解决方案,只是不同的解决方法。我没有找到问题的根源。

案例#1 src/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,

案例#4将lib%.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打印有关已完成内容的详细信息,但我无法获得最终结果。问题似乎是因为A.exe有两个目标而一个没有收据行。