【发布时间】:2020-06-25 20:26:42
【问题描述】:
我有这个 Makefile(和 GNU Make):
vpath %.o .objs
OBJDIR=.objs
all: symbol_tests.so
symbol_tests.so: symbol_tests.o symbol.o # simulate linking
@echo Linking target: $@, prerequisites: $^
%.o: %.c | $(OBJDIR)/
gcc -o $(OBJDIR)/$@ -c $<
$(OBJDIR)/:
-mkdir $@
但是构建(没有任何子目录或对象存在)给我这个:
mkdir .objs/
gcc -o .objs/symbol_tests.o -c symbol_tests.c
gcc -o .objs/symbol.o -c symbol.c
Linking target: symbol_tests.so, prerequisites: symbol_tests.o symbol.o
很明显,因为symbol.o 和symbol_test.o 都不存在,所以它们需要被构建。
并且它们被正确放置在子目录./objs。
但是当“链接”时,vpath 不会在.objs 子目录中获取新创建的.o-文件。
这不是很奇怪吗?再次运行make 会得到:
Linking target: symbol_tests.so, prerequisites: .objs/symbol_tests.o .objs/symbol.o
在我看来,为了触发在子目录中搜索 .o,当调用 make 时,它们必须存在。这样就违背了vpath的目的,不是吗?
还是我的Makefile或对vpath的理解有问题?
注意:在 vpath 指令中包含 $(OBJDIR) 不起作用。为什么?
【问题讨论】:
-
正如 Greg 所说,您不能使用 VPATH 来定位目标文件。您可以考虑阅读以下内容:make.mad-scientist.net/papers/how-not-to-use-vpath
标签: makefile gnu-make vpath automatic-variable