我的Makefile:
CC=cc
INC=-I.
CFLAGS=-g -DDEBUG -std=gnu99 -DSFHASH -DDOMAIN
LDFLAGS=-ldl
OBJS=*.o
OBJDIR=.obj
BINDIR=.obj
LIBDIR=.obj
%.o: %.c
$(CC) $(INC) $(CFLAGS) -DSFHASH -o $(OBJDIR)/$@ -c $<
VPATH = .obj
#vpath %.o $(OBJDIR)
hashtest: hashfuncs.o hast.o scanners.o parseargs.o
$(CC) -rdynamic -o $(BINDIR)/$@ $^ $(LDFLAGS)
clean:
@rm -f $(OBJDIR)/$(OBJS) $(BINDIR)/hashtest
第一次使用它:make 不会重写 gcc 的输入文件路径:
@delphi# make clean
@delphi# make
cc -I. -g -DDEBUG -std=gnu99 -DSFHASH -DDOMAIN -DSFHASH -o .obj/hashfuncs.o -c hashfuncs.c
cc -I. -g -DDEBUG -std=gnu99 -DSFHASH -DDOMAIN -DSFHASH -o .obj/hast.o -c hast.c
cc -I. -g -DDEBUG -std=gnu99 -DSFHASH -DDOMAIN -DSFHASH -o .obj/scanners.o -c scanners.c
cc -I. -g -DDEBUG -std=gnu99 -DSFHASH -DDOMAIN -DSFHASH -o .obj/parseargs.o -c parseargs.c
cc -rdynamic -o .obj/hashtest hashfuncs.o hast.o scanners.o parseargs.o -ldl
cc: error: hashfuncs.o: No such file or directory
cc: error: hast.o: No such file or directory
cc: error: scanners.o: No such file or directory
cc: error: parseargs.o: No such file or directory
make: *** [hashtest] Error 1
连续第二次使用它,它确实:
@delphi# make
cc -rdynamic -o .obj/hashtest .obj/hashfuncs.o .obj/hast.o .obj/scanners.o .obj/parseargs.o -ldl
@delphi#
GNU Make 手册说:
make 变量 VPATH 的值指定了 make 应该搜索的目录列表。大多数情况下,目录应该包含不在当前目录中的必备文件;但是,make 使用 VPATH 作为先决条件和 *规则目标* 的搜索列表。
我会理解 VPATH 是否是一个在启动时设置一次的类型变量,但它不是。正确查找在运行时生成的目标依赖项这一事实说明了这一点。
那是怎么回事?为什么 make 仅第二次正确重写 gcc 的输入文件路径?