make的路径搜索

文章目录

  • 前言
  • 一、VPATH
  • 二、vpath
  • 三、vpath 与 VPATH 的差别
  • 四、GPATH 用法
  • 总结

前言

在大型软件项目中,通常会存在多个目录,包含有源代码、头文件、库文件等不同类型的文件。在编译或链接时,需要指定相应的文件路径才能正确地进行构建。但是,手动设置文件路径比较麻烦,

Makefile 中,使用 VPATHvpath 命令来设置文件搜索路径,从而方便地进行模块间的编译和链接。


一、VPATH

  1. VPATH 介绍:
  • VPATH 是一个特殊的变量,用于指定额外的搜索路径, 指示 make 如何查找文件。
  • 当文件夹找不到需要的文件时, VPATH 就会被调用。
  • make 会在 VPATH 指定的文件夹中依次搜索文件。
  • 文件夹名字之间需要 分隔符 进行区分。

例如:
VPATH := inc src ( 空格 )
VPATH := inc ;src ( 分号)
VPATH := inc : src ( 冒号)

  1. include-path 为 头文件的路径,指定参数 - I
    在这里插入图片描述

示例 :
.c 文件放在 src 文件夹中, .h 文件放在 inc 文件夹内。
make的路径搜索_第1张图片

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

  1. 当 VPATH 使用时,如果 在 inc 头文件夹中意外出现了 源文件 .c / .cpp , 那么可能出现编译错误。

解决方案:vpath 关键字(小写)。

vpath : 可以 为不同类型的文件 指定不同的搜索路径。

语法:在 Directory 文件夹中 搜索符合 Pattern 的规则的文件。
make的路径搜索_第2张图片

例:
inc 中搜索 .h 文件 : vpath %.h inc
src 中搜索 .c 文件 : vpath %.c src

  1. 取消搜索规则
  • 取消已经设置的某个规则
    vpath Pattren

例:
inc 文件夹中搜索 .h 文件 : vpath %.h inc
不到 inc 文件夹中搜索 .h 文件 : vpath %.h

  • 取消 所有 已经设置的规则。
    vpath

示例代码
.c 文件放在 src 文件夹中, .h 文件放在 inc 文件夹内。
make的路径搜索_第3张图片

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 指定的文件夹。
    make的路径搜索_第4张图片

问题 2 . 当 vpath 对同一个 模式 指定多个夹时, make 会如何处理?
make 首先在当前文件夹搜素需要的文件。
如果失败

  • make 以自上而下的顺序搜索 vpath 指定的文件夹。
  • 当找到文件,搜索结束。
    make的路径搜索_第5张图片

四、GPATH 用法

当 依赖改变时,如何使得 src 文件夹下的 hello.out 被更新?

解决方案:
使用 GPATH 特殊变量指定目标文件夹
GPATH := src

  • hello.out 完全不存在
    make 默认在当前文件夹创建 hello.out

  • 当 hello.out 存在于 src 文件夹中,且依赖文件被更新
    make 在 src 文件夹 创建 hello.out


总结

下一篇介绍 编译环境。

你可能感兴趣的:(Makefile,linux,运维,服务器,makefile,脚本)