![makefile中的使用 VAPTH 和“自动变量”指定目标文件的存放目录 makefile中的使用 VAPTH 和“自动变量”指定目标文件的存放目录](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pL2ViZDI5ZDE4ZmRlMWViZjY0OWUyNjAxODg3ZWRhNThiMS5qcGc%3D.jpg?w=700&webp=1)
![makefile中的使用 VAPTH 和“自动变量”指定目标文件的存放目录 makefile中的使用 VAPTH 和“自动变量”指定目标文件的存放目录](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pL2ViZDI5ZDE4ZmRlMWViZjY0OWUyNjAxODg3ZWRhNThiMS5qcGc%3D.jpg?w=700&webp=1)
![makefile中的使用 VAPTH 和“自动变量”指定目标文件的存放目录 makefile中的使用 VAPTH 和“自动变量”指定目标文件的存放目录](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pL2ViZDI5ZDE4ZmRlMWViZjY0OWUyNjAxODg3ZWRhNThiMS5qcGc%3D.jpg?w=700&webp=1)
![makefile中的使用 VAPTH 和“自动变量”指定目标文件的存放目录 makefile中的使用 VAPTH 和“自动变量”指定目标文件的存放目录](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pL2ViZDI5ZDE4ZmRlMWViZjY0OWUyNjAxODg3ZWRhNThiMS5qcGc%3D.jpg?w=700&webp=1)
--《GUN make 手册》4.4.1 《VPATH:依赖文件的搜索路径》
需求描述:
一个项目中有两个类Main和Pub,生成的可执行文件为winner。其文件分布结构如下:
我们希望,无论pub移动到哪里,在makefile中做尽量少的修改。
最简单的makfile文件内容如下:
CC = g++
COMPILE.C = $(CC) -c
MAKEEXE = $(CC) $(LDFLAGS)
OBJ = main.o ../pub/b.o
EXE = winner
all: $(EXE)
$(EXE): ${OBJ}
$(MAKEEXE) $(OBJ) -o $(EXE)
main.o: main.cpp
$(COMPILE.C) main.cpp -o main.o
../pub/b.o: ../pub/b.cpp
$(COMPILE.C) ../pub/b.cpp -o ../pub/b.o
clean:
rm -f *.o $(EXE) core
上面的makefile使用了三次路径。修改起来很麻烦。我们可以通过使用“虚拟路径”(VPATH)和"自动变量"对其进行优化。
经过优化的 makefile 文件如下:
COMPILE.C = $(CC) -c
VPATH = ../pub
MAKEEXE = $(CC) $(LDFLAGS)
OBJ = main.o ../pub/b.o
EXE = winner
all: $(EXE)
$(EXE): ${OBJ}
$(MAKEEXE) $< -o $@
main.o: main.cpp
$(COMPILE.C) $< -o $@
b.o: b.cpp
$(COMPILE.C) $< -o $@
clean:
rm -f *.o $(EXE) core
解释:
VPATH用于依赖检查。
上面的"$^","$@"称做“自动变量”。(automatic variables)“自动变量”用于shell 命令参数。