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

总结

下一篇介绍 编译环境。

相关文章
|
测试技术 Linux 内存技术
怎样设置freeswitch 的高并发数
怎样设置freeswitch 的高并发数
|
9月前
|
敏捷开发 监控 数据可视化
项目仪表盘的妙用:让管理更清晰、更高效、更智能
项目仪表盘是现代项目管理中的重要工具,提供实时数据、多维分析及高度定制的可视化界面,帮助管理者快速决策、优化资源分配、提高团队协作效率和项目可控性。推荐的工具包括板栗看板、Jira、Trello、Asana 和 ClickUp,它们各有特色,适用于不同规模和类型的团队。
295 4
|
5月前
|
存储 人工智能 自然语言处理
RAG 调优指南:Spring AI Alibaba 模块化 RAG 原理与使用
通过遵循以上最佳实践,可以构建一个高效、可靠的 RAG 系统,为用户提供准确和专业的回答。这些实践涵盖了从文档处理到系统配置的各个方面,能够帮助开发者构建更好的 RAG 应用。
2722 114
|
弹性计算 关系型数据库 MySQL
centos7 mysql安装及配置
本文详细介绍了在阿里云服务器ECS上通过yum源安装MySQL 8.0.12的过程,包括更新yum源、下载并安装MySQL源、解决安装过程中可能遇到的问题等步骤。此外,还介绍了如何启动MySQL服务、设置开机自启、配置登录密码、添加远程登录用户以及处理远程连接异常等问题。适合初学者参考,帮助快速搭建MySQL环境。
1137 8
centos7 mysql安装及配置
|
JavaScript Java 测试技术
基于SpringBoot+Vue的人力资源管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的人力资源管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
222 8
|
机器学习/深度学习 存储 人工智能
构建坚不可摧的系统安全防线:策略、实践与未来展望
系统安全是维护社会稳定、保障企业运营和个人隐私的重要基石。构建坚不可摧的系统安全防线需要从多个维度出发制定全面的安全策略并付诸实践。未来随着技术的不断进步和应用场景的不断拓展,系统安全将面临更多的挑战和机遇。只有不断创新和完善安全技术和策略才能应对日益复杂的安全威胁和挑战确保系统的安全和稳定运行。
|
存储 安全 关系型数据库
MySQL中使用percona-xtrabackup工具 三种备份及恢复 (超详细教程)
MySQL中使用percona-xtrabackup工具 三种备份及恢复 (超详细教程)
1018 1
|
调度 UED Python
探索Python中的异步编程:从回调到async/await
本文将深入探讨Python中的异步编程,从最初的回调函数到现代的async/await语法。通过比较不同的异步编程方法,读者将了解它们的优缺点,并学习如何在项目中选择合适的方式来提高性能和可维护性。
|
安全 小程序 数据建模
SSL OV证书和DV、EV证书的区别
市场上常见的SSL证书有三种:DV(域名验证)、OV(组织验证)和EV(扩展验证)。DV证书仅验证域名,适合个人和小企业,安全性较低;OV证书验证域名和企业身份,广泛用于中型企业,提供更强安全性和企业信息显示;EV证书经过最严格验证,适用于银行等高安全行业,显示绿色地址栏。选择取决于安全需求和预算,个人网站常选DV,中型企业多选OV,大型及高安全场景推荐EV。
|
Arthas Prometheus 监控
JVM工作原理与实战(二十九):监控内存泄漏的工具
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了解决内存溢出的步骤、Top命令、VisualVM、Arthas、Prometheus + Grafana等内容。
802 0