我有这个 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
存在,因此需要构建它们。并且它们正确放置在 subdir 中./objs
。
但是当“链接”时,vpath
不会在.o
子目录中选择新创建的文件.objs
。
这不是很奇怪吗?再次运行make
给出:
Linking target: symbol_tests.so, prerequisites: .objs/symbol_tests.o .objs/symbol.o
在我看来,为了触发在子目录中的搜索,它们在被调用.o
时必须存在。make
那种违背目的的vpath
,不是吗?
还是我Makefile
的理解有问题vpath
?
注意:在 vpath 指令中包含 $(OBJDIR) 不起作用。为什么?