在下面的例子中,是否有人可以帮助我理解为什么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
答案 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
有两个目标而一个没有收据行。