makefile中的使用 VAPTH 和“自动变量”指定目标文件的存放目录

时间:2022-06-15 22:21:13

 

makefile中的使用 VAPTH 和“自动变量”指定目标文件的存放目录
makefile中的使用 VAPTH 和“自动变量”指定目标文件的存放目录The value of the make variable VPATH specifies a list of directories that make should search. Most often, the directories are expected to contain prerequisite files that are not in the current directory; however, make uses VPATH as a search list for both prerequisites and targets of rules.
makefile中的使用 VAPTH 和“自动变量”指定目标文件的存放目录                                                                                    --《GNU make》, Version 3.81  4.4.1 《VPATH: Search Path for All Prerequisites》
makefile中的使用 VAPTH 和“自动变量”指定目标文件的存放目录 "VPATH" 变量指定了一个供make 搜索的目录列表。通常理解,这些目录服务于依赖文件,它包含了不在当前目录而又被目标文件所依赖的文件。然而,make 将这个目录列表同时应用于依赖文件和目标文件。
                                                                                       --《GUN make 手册》4.4.1 《VPATH:依赖文件的搜索路径》

 

 
需求描述:
一个项目中有两个类Main和Pub,生成的可执行文件为winner。其文件分布结构如下:

makefile中的使用 VAPTH 和“自动变量”指定目标文件的存放目录
我们希望,无论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 文件如下:

CC                          =  g++
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 命令参数。