Makefile GNU make:指定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%

有人能帮我理解为什么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%.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中修复的。

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

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