前言
在大型软件项目中,通常会存在多个目录,包含有源代码、头文件、库文件等不同类型的文件。在编译或链接时,需要指定相应的文件路径才能正确地进行构建。但是,手动设置文件路径比较麻烦,
在 Makefile 中,使用 VPATH
和 vpath
命令来设置文件搜索路径,从而方便地进行模块间的编译和链接。
一、VPATH
- VPATH 介绍:
- VPATH 是一个特殊的变量,用于指定额外的搜索路径, 指示 make 如何查找文件。
- 当文件夹找不到需要的文件时, VPATH 就会被调用。
- make 会在 VPATH 指定的文件夹中依次搜索文件。
- 文件夹名字之间需要
分隔符
进行区分。
例如:
VPATH := inc src ( 空格 )
VPATH := inc ;src ( 分号)
VPATH := inc : src ( 冒号)
- include-path 为 头文件的路径,指定参数 - I 。
示例 :
.c 文件放在 src 文件夹中, .h 文件放在 inc 文件夹内。
OBJS := func.o main.o INC := inc # .h 文件 SRC := src # .c 文件 VPATH := $(INC) $(SRC) CFLAGS := -I $(INC) # 指定头文件路径 hello.out : $(OBJS) @gcc -o $@ $^ @echo "Target ==> $@" $(OBJS) : %.o :%.c func.h @gcc $(CFLAGS) -c -o $@ $<
注意:
当多个文件夹存在同名文件时,选择第一次搜索到的文件
。
二、vpath
- 当 VPATH 使用时,如果 在 inc 头文件夹中意外出现了 源文件 .c / .cpp , 那么可能出现编译错误。
解决方案:vpath 关键字(小写)。
vpath : 可以 为不同类型的文件
指定不同的搜索路径。
语法:在 Directory 文件夹中 搜索符合 Pattern 的规则的文件。
例:
在 inc 中搜索 .h 文件 : vpath %.h inc
在 src 中搜索 .c 文件 : vpath %.c src
- 取消搜索规则
- 取消已经设置的某个规则
vpath Pattren
例:
在 inc 文件夹中搜索 .h 文件 : vpath %.h inc 。
不到 inc 文件夹中搜索 .h 文件 : vpath %.h。
- 取消
所有
已经设置的规则。
vpath
示例代码
.c 文件放在 src 文件夹中, .h 文件放在 inc 文件夹内。
OBJS := func.o main.o SRC := src INC := inc CFLAGS := -I $(INC) vpath %.h $(INC) # 指定 在 INC 文件夹中查找 .h 文件 vpath %.c $(SRC) # 指定 在 SRC 文件夹中查找 .c 文件 hello.out : $(OBJS) @gcc -o $@ $^ @echo "Target ==> $@" $(OBJS) : %.o : %.c func.h @gcc $(CFLAGS) -c -o $@ $<
三、vpath 与 VPATH 的差别
问题 1 . 当 vpath 与 VPATH 同时出现时, make 会如何处理?
make 首先在当前文件夹搜素需要的文件。
如果失败
:
- make 优先在 vpath 指定的文件夹中搜索目标文件。
- 当 vpath 搜索失败时,转而搜索 VPATH 指定的文件夹。
问题 2 . 当 vpath 对同一个 模式 指定多个夹时, make 会如何处理?
make 首先在当前文件夹搜素需要的文件。
如果失败
:
- make 以自上而下的顺序搜索 vpath 指定的文件夹。
- 当找到文件,搜索结束。
四、GPATH 用法
当 依赖改变时,如何使得 src 文件夹下的 hello.out 被更新?
解决方案:
使用 GPATH 特殊变量指定目标文件夹
。
GPATH := src
- 当
hello.out 完全不存在
:
make 默认在当前文件夹创建 hello.out
当 hello.out 存在于 src 文件夹中,且依赖文件被更新
:
make 在 src 文件夹 创建 hello.out
总结
下一篇介绍 编译环境。