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

1

这看起来像是GNUMake 中的一个已知错误,已在版本 3.82 中修复。

于 2013-06-21T23:55:41.800 回答
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,

案例 #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,一个没有收据行。

于 2013-06-22T22:21:21.170 回答