make的路径搜索

news2024/11/18 6:29:20

文章目录

  • 前言
  • 一、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 文件夹内。
在这里插入图片描述

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


总结

下一篇介绍 编译环境。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/570105.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机图形学】曲线和曲面(Bezier曲线 Bezier曲面)

模块5 曲线和曲面 一 实验目的 编写曲线和曲面的算法 二 实验内容 1&#xff1a;绘制Bezier曲线&#xff0c;并采用自行设计输入和交互修改数据点的方式。 实验结果如下图所示&#xff1a; 第一步&#xff1a;输入特征多边形的顶点个数&#xff0c;并按照顺序输入顶点的坐…

css3新增特性

1. 初始化 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, …

怎么通过ecs云服务器来给小程序发送消息

如果您想通过 ECS 云服务器向小程序发送消息&#xff0c;可以使用 WebSocket 技术。具体步骤如下&#xff1a; 1. 在 ECS 云服务器上搭建 WebSocket 服务器。您可以使用 Node.js、Java、Python 等编程语言来实现 WebSocket 服务器&#xff0c;具体实现方式可参考相关技术文档或…

Java笔记——KMP算法

KMP算法 文章目录 KMP算法KMP算法介绍主要逻辑Next数组KMP搜索代码解释生成next数组模式串匹配 源码展示 KMP算法介绍 KMP算法是一种串的模式匹配算法&#xff0c;用来求子串在主串的位置。是数据结构中比较难的一种算法。KMP算法的核心在于点在于如何利用子串生成next数组&am…

vim的使用、vim入门的三种常用模式、以及vim中常用的命令(超详细)

vim 入门的三种常用模式&#xff1a;分别是 1. 命令模式、2. 插入/编辑模式、3. 底行模式 1. 命令模式 控制屏幕光标的移动&#xff0c;字符、字或行的删除&#xff0c;移动复制某区段及进入Insert mode下&#xff0c;或者到 last line mode 如下&#xff0c;这个就是命令模式…

Numpy入门看这一篇就够了【史上入门最简单,开袋即食】

一边学习一边分享&#xff0c;好记性不如烂笔头 目录 一边学习一边分享&#xff0c;好记性不如烂笔头 NumPy问题思考&#xff1a; numpy是什么&#xff1f; 为什么要学习numpy&#xff1f; numpy是怎么组成的&#xff1f;特点是什么&#xff1f; numpy的应用场景有哪些&a…

css定位模式

1. 为什么需要定位&#xff1f; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"…

自动化专业求职方向与前景分析(合集)

自动化专业求职方向与前景分析 自动化专业求职方向 自动化专业是近几年高校教育改革中几个控制类专业合并后形成的宽口径专业&#xff0c;其实自动化就是搞控制的&#xff0c;用老师的话说就是控制一切可以控制的物理量&#xff0c;还说学自动化的人都要有控制的欲望。所谓控制…

Augmented Language Models(增强语言模型)

Augmented Language Models: A Survey 先上地址&#xff1a;https://arxiv.org/pdf/2302.07842.pdf 概率论难以支撑通用人工智能技术的诞生。—— Yann LeCun LLMs取得的巨大进展不再多说&#xff0c;它目前被诟病最多的问题是其会提供非事实但看似可信答案&#xff0c;即幻觉…

数组排序——从荷兰国旗问题到快速排序

本文首先将会介绍荷兰国旗问题&#xff0c;再讲述如何从该问题过渡到快速排序。 荷兰国旗问题 荷兰国旗问题&#xff08;Dutch National Flag Problem&#xff09;是由荷兰计算机科学家Edsger Dijkstra所提出&#xff0c;该问题的描述如下&#xff1a; 给定n个红、白、蓝三种颜…

JNDI学习笔记

最近在研究JNDI注入漏洞&#xff0c;就先浅浅的学习以下JNDI相关知识。 JNDI对各种目录服务的实现进行抽象和统一化。 在 Java 应用中除了以常规方式使用名称服务(比如使用 DNS 解析域名)&#xff0c;另一个常见的用法是使用目录服务作为对象存储的系统&#xff0c;即用目录服务…

SpringBoot --- 基础篇

一、快速上手SpringBoot 1.1、概述 SpringBoot开发团队认为原始的Spring程序初始搭建的时候可能有些繁琐&#xff0c;这个过程是可以简化的&#xff0c;那原始的Spring程序初始搭建过程都包含哪些东西了呢&#xff1f;为什么觉得繁琐呢&#xff1f;最基本的Spring程序至少有一…

大数据:VMware | Ubuntu | Hadoop | Spark | VMwaretools | Python 安装配置总结

一.环境概述 Linux发行版&#xff1a;Ubuntu虚拟机应用&#xff1a;VMware Workstation ProHadoop版本&#xff1a;3.1.3|伪分布式集群JDK版本&#xff1a;JDK1.8.0_162Spark版本:2.4.0Scala版本:2.12.8Python版本:3.6.8 | 3.7.16 二.Ubuntu 2.1 光盘文件 首先进入链接Down…

因为AI,我被裁了;MJ设计海报全流程;独立开发者每周收入2.3K美元;MJ常用参数超详细介绍 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 受 AI 影响&#xff0c;这 8 家公司开始裁员…… 为了搞清楚 AI 最近在影响哪些行业、哪些职业&#xff0c;作者花了三天事件找到了八…

基于SSM的网络在线考试系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 前言…

《Java并发编程实战》课程笔记(二)

可见性、原子性和有序性问题&#xff1a;并发编程 Bug 的源头 源头之一&#xff1a;缓存导致的可见性问题 在单核时代&#xff0c;所有的线程都是在一颗 CPU 上执行&#xff0c;CPU 缓存与内存的数据一致性容易解决。 因为所有线程都是操作同一个 CPU 的缓存&#xff0c;一个…

《面试1v1》ThreadLocal

我是 javapub&#xff0c;一名 Markdown 程序员从&#x1f468;‍&#x1f4bb;&#xff0c;八股文种子选手。 面试官&#xff1a; 你好&#xff0c;请问你对 ThreadLocal 有了解吗&#xff1f; 候选人&#xff1a; 您好&#xff0c;我知道 ThreadLocal 是一个 Java 中的类&a…

【坐标变换】坐标系坐标变换简单推导--未完待续

如图所示&#xff0c;假设已知坐标系 ( X , Y ) (X,Y) (X,Y)&#xff0c;旋转后的坐标系为 ( X ′ , Y ′ ) (X,Y) (X′,Y′)&#xff0c;旋转角度为 θ \theta θ&#xff0c;假设点p在 ( X , Y ) (X,Y) (X,Y)坐标系下为 ( x , y ) (x,y) (x,y)&#xff0c;坐标在旋转后的坐标…

速来!谷歌师兄的LeetCode刷题笔记开源了!

有小伙伴私聊我说刚开始刷LeetCode的时候&#xff0c;感到很吃力&#xff0c;刷题效率很低。我以前刷题的时候也遇到这个问题&#xff0c;直到后来看到这个谷歌师兄总结的刷题笔记&#xff0c;发现LeetCode刷题都是套路呀&#xff0c;掌握这些套路之后&#xff0c;就变得非常简…

kubernetes高可用+harbor高可用

kubernetes高可用harbor高可用 基于kubeadm安装kubernetes高可用集群全部主机环境初始化双主节点部署keepalive双主节点初始化kubeadm在k8smaster1节点上初始化k8s在k8smaster2节点上做扩容操作 harbor高可用集群初始化harbor1节点安装环境在另一台节点上配置使用私有harbor仓库…