Makefile GNU make:指定VPATH时的循环依赖关系
有人能帮我理解为什么GNUMake在下面的例子中考虑“循环依赖性”吗。如果未指定VPATH,并且源文件显示在当前目录中,则一切正常Makefile GNU make:指定VPATH时的循环依赖关系,makefile,gnu-make,circular-dependency,vpath,Makefile,Gnu Make,Circular Dependency,Vpath,有人能帮我理解为什么GNUMake在下面的例子中考虑“循环依赖性”吗。如果未指定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%
$ 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
$cat Makefile
VPATH=src
src%.o:%.cpp
@回声:$@:$<
库%.o:%.cpp
@回声:$@:$<
dll%.so:%.cpp
@回声:$@:$<
lib%.so:lib%.o dll%.so
@回声:$@:$<
A.exe:libA.so
%.exe:src%.o
@回声:$@:$<
$make
make:Circular dllA.so这看起来像是在版本3.82中修复的。这不是一个真正的解决方案,只是不同的解决方法。我没有找到问题的根源
案例#1src/A.cpp
存在,使文件稍微修改:
#!/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: ;
案例3 VPATH位于代码中,取消注释@echo echo_45:$:$
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,
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,
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,
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,