make的路径搜索

简介: make的路径搜索

前言

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

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 文件夹内。

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 的规则的文件。

例:

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 文件夹内。

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

总结

下一篇介绍 编译环境。

相关文章
|
6月前
|
Linux 编译器 Apache
make与 configure
【5月更文挑战第10天】make与 configure。
53 1
|
6月前
|
C语言
make的执行步骤以及常见的make命令,make distclean 以及和make clean的区别
make的执行步骤以及常见的make命令,make distclean 以及和make clean的区别
252 0
|
6月前
|
C++
make 及 make clean 的作用
make 及 make clean 的作用
161 0
make/makefile的使用
make/makefile的使用
make menuconfig‘ requires the ncurses libraries.
make menuconfig‘ requires the ncurses libraries.
140 0
make[1]: Nothing to be done for `all-am'.
make[1]: Nothing to be done for `all-am'.
200 0
make[1]: Nothing to be done for `all-am&#39;.
make[1]: Nothing to be done for `all-am&#39;.
610 0
|
Unix Shell Linux
./configure、make、make install 命令详解
这些都是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤 一、基本信息 1、./configure 是用来检测你的安装平台的目标特征的。
4109 0