Makefile基础教程(路径搜索)

news2024/11/24 20:43:12

文章目录

  • 前言
  • 一、常用的源码管理方式
  • 二、VPATH和vpath
    • 1.VPATH
    • 2.vpath
    • 3.VPATH和vpath优缺点对比
  • 三、VPATH和vpath同时出现make会怎么处理
  • 四、vpath指定多个文件夹
  • 总结


前言

在前面的文章中我们的文件全部都是放在同一个目录下面的,那么在实际的工程开发中会这样做吗?答案肯定是不会的,因为将全部的文件放在同一个目录下会显得十分凌乱,这样不便于代码的管理。

一、常用的源码管理方式

我们通常将各个模块的源码分开管理,并且将模块中的.c文件和.h文件也分开管理,这样便于我们代码的移植和管理。
在这里插入图片描述
那么通过这样管理后make怎么样来找到对应的文件在哪里呢?

二、VPATH和vpath

1.VPATH

VPATH 是 Make 中的一个变量,用于指定 Makefile 查找源文件的路径。当 Makefile 中需要使用一些源文件时,如果这些源文件不在当前目录下,则需要通过 VPATH 变量指定其他目录来查找这些源文件,以便编译生成目标文件。

在 Makefile 中,可以通过在 VPATH 变量中设置一系列目录路径来指定源文件的搜索路径。例如:

VPATH = src:../lib:../../include

上面的代码中,VPATH 变量指定了三个目录,用冒号分隔。Make 在查找源文件时,会先在当前目录下查找,如果找不到,就会依次在 VPATH 指定的目录中查找,直到找到为止。

通过 VPATH 变量,可以将源文件放在多个目录中,避免出现 “No such file or directory” 的错误,并且可以减少 Makefile 的编写工作,使 Makefile 的可读性和可维护性更好。同时,VPATH 还可以与通配符一起使用,更为方便地搜索源文件。

需要注意的是,VPATH 只用于指定源文件的搜索路径,而不影响生成目标文件的路径,如果想要更改生成的目标文件的路径,则需要使用其他机制,例如将变量 $@ 设置为所需的目标文件路径。

使用方法:
首先先在当前路径下创建makefile和src,inc这三个文件夹。并且在src中存放.c文件在inc中存放.h文件。
在这里插入图片描述
makefile:
这里使用VPATH指定了头文件和源文件的查找路径,那么为什么还需要使用-I选项来指定inc路径呢?

需要注意的是,在使用 VPATH 变量时,一般都需要通过 -I 选项来指定头文件的查找路径,这样才能让编译器正确地找到所需的头文件。

CC := gcc

VPATH := inc src

hello : main.c main.h
	$(CC) -c -o $@ $< -I inc

2.vpath

vpath 也是 Make 中的一个变量,与 VPATH 功能类似,可以指定在哪些目录中查找匹配的文件。vpath 与 VPATH 的区别在于,它是一种模式化的路径指定方式,可以针对不同的文件类型指定不同的搜索路径。

在 Makefile 中,可以通过在 vpath 变量中设置文件模式和对应的目录路径来使用 vpath。例如:

vpath %.c src
vpath %.h include
vpath %.o obj

上面的代码中,vpath 指定了三种文件模式和对应的目录路径,% 表示通配符,匹配对应模式的文件名。Make 在查找符合模式的文件时,会先在当前目录下查找,如果找不到,就会按照 vpath 中指定的目录顺序依次查找,直到找到为止。

通过 vpath 可以更加灵活地指定不同类型的文件的搜索路径,避免了 VPATH 在搜索时搜索所有的文件类型的缺陷。在实际的编译过程中,可能需要指定各种文件类型的搜索路径,vpath 可以方便地解决这个问题。

与 VPATH 相同,在使用 vpath 时,也需要注意生成目标文件的路径,如果需要修改生成的目标文件的路径,需要在对应的目标规则中进行设置,例如使用 $@ 表示目标文件路径。

具体使用:
同样的在使用vpath时也需要使用-I来指定头文件路径。

CC := gcc

vpath %.h inc
vpath %.c src

hello : main.c main.h
	$(CC) -c -o $@ $< -I inc

3.VPATH和vpath优缺点对比

VPATH 和 vpath 两个变量在 Makefile 中都用来指定文件的搜索路径,区别在于它们的作用范围和使用方式。

VPATH 变量:
优点:

可以指定 Make 在哪些目录中查找依赖文件,能够完全覆盖 Makefile 中的规则。
可以将源文件和依赖文件分开存放,方便管理和维护。
可以使用通配符匹配一类文件,并指定对应的目录路径。

缺点:

对于每一个 Make 规则,都需要手动添加 VPATH 变量,这会增加 Makefile 的复杂度。
在 Make进行依赖文件查找时,VPATH 会覆盖当前目录,这可能会对意图不明确的 Makefile 产生影响。

vpath 变量:
优点:

全局变量,避免了重复添加和修改变量的麻烦。
可以根据文件类型进行匹配,并指定对应的搜索路径。
使用简单,不用为每一个规则手动添加搜索路径变量。

缺点:

只能指定文件类型和目录路径,而不能针对特定的文件进行指定。
如果存在同名文件,可能会出现查找到错误文件的问题。

综上所述,VPATH 变量和 vpath 变量都有各自的优缺点,在实际使用时需要根据需求和具体情况选择。VPATH 变量可以精确控制每个规则需要查找的目录,但是使用起来比较繁琐;vpath 变量虽然使用简单,但是会受到同名文件的影响。

三、VPATH和vpath同时出现make会怎么处理

当在 Makefile 中同时出现 VPATH 和 vpath 两个变量时,它们的作用是相互独立的。

在查找依赖文件时,Make 会首先查找当前目录下是否存在所需的文件,如果不存在则会根据 vpath 变量指定的搜索路径查找文件,如果还是找不到则会根据 VPATH 变量指定的搜索路径查找文件。

所以make会优先选择在vpath指定的s搜索路径查找文件。

make会先在vpath指定的src路径下进行查找,当查找不到时再到VPATH指定的src1中进行查找。

CC := gcc

vpath %.h inc
vpath %.c src
VPATH := src1

hello : main.c main.h
	$(CC) -c -o $@ $< -I inc

四、vpath指定多个文件夹

当使用 vpath 指定多个文件夹时,make 的行为会先在当前目录中查找所需要的文件,如果找不到,则会在指定的文件夹中按顺序查找,直到找到该文件或所有指定的文件夹都被查找完毕。

如果在多个指定文件夹中存在同名的文件,则 make 会按照指定的顺序查找这些文件夹,找到其中一个同名文件后就会停止查找。

这里使用vpath指定了src,src1,src2,make会按照顺序先在src下查找再到src1下查找,当查找到后就停止查找。

CC := gcc

vpath %.h inc
vpath %.c src
vpath %.c src1
vpath %.c src2

hello : main.c main.h
	$(CC) -c -o $@ $< -I inc

总结

本篇文章讲解了make是如何进行路径搜索的,这个知识点在后面项目开发管理makefile的时候会起的非常大的作用,希望大家好好总结。

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

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

相关文章

阿里云服务器备份到本地 镜像 快照 OSS存储 (保姆级图文)

目录 省钱措施1. 创建自定义镜像2. 导出镜像创建/选择OSS对象存储空间 3. 下载到本地总结 欢迎关注 『发现你走远了』 博客&#xff0c;持续更新中 欢迎关注 『发现你走远了』 博客&#xff0c;持续更新中 阿里云的这个官方步骤要收几毛钱的费用 因为他要求必须先快照镜像&…

通过一个平面几何题来梳理解题模型

昨天一位邻居在群里问了一道题目&#xff1a; 已知&#xff1a;如图&#xff0c;OA平分∠BAC&#xff0c;∠1∠2&#xff0e;求证&#xff1a;△ABC是等腰三角形&#xff0e; 先不讲如何来解答这个题目&#xff0c;重点是我们来分析这道题到底在考察什么&#xff0c;如果条件换…

使用ScreenToGif录制GIF动态图

文章目录 1.下载ScreenToGif工具2. 下载后双击下面的.msi文件进行安装3. 在编辑器中可以对所有帧添加文字描述 1.下载ScreenToGif工具 链接&#xff1a;https://pan.baidu.com/s/1rvFZSbMdNus90hbzxsJlGA 提取码&#xff1a;gyqe2. 下载后双击下面的.msi文件进行安装 按照默认…

springboot高校专业招生信息管理系统jsp001

对于学校来说&#xff0c;每年的学生越来越多&#xff0c;需要管理的专业也有很多&#xff0c;每次专业报名信息的统计工作就变得非常的多&#xff0c;对于报名的统计工作变得非常的复杂。进入二十一世纪后&#xff0c;各种科学技术发速发展&#xff0c;管理软件尤其明显&#…

Golang每日一练(leetDay0078) 存在重复元素 II\III ContainsDuplicate

目录 219. 存在重复元素 II Contains Duplicate ii &#x1f31f; 220. 存在重复元素 III Contains Duplicate iii &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏…

chatgpt赋能python:Python判断语句:if语句

Python判断语句&#xff1a;if语句 在Python编程中&#xff0c;判断语句是非常重要的语法之一。if语句是最基本的判断语句&#xff0c;可以根据条件的真假来执行我们需要的代码块。 什么是if语句&#xff1f; if语句是一种条件语句。在Python中&#xff0c;if语句用于执行一…

C++泛型编程之模板

目录 一、什么是泛型编程 二、函数模板 2.1函数模板的概念 2.2函数模板格式 2.3函数模板的原理 2.5函数模板的实例化 2.6模板参数的匹配原则 三、类模板 3.1类模板的定义格式 3.2 类模板的实例化 四、非类型模板参数 五、模板的特化 5.1模板特化的概念&#xff1a;…

chatgpt赋能python:Python在SEO中的应用

Python在SEO中的应用 Python是一种语言&#xff0c;用于编写应用程序。近年来&#xff0c;Python编程成为了最受欢迎的编程语言之一。Python主要用于数据分析、机器学习、人工智能等方向。但是&#xff0c;Python在SEO中的应用也引起了越来越多的人的关注。那么&#xff0c;在…

bean的作用域及生命周期

目录 bean的作用域 ①概念 ②创建类User ③配置bean ④测试 bean生命周期 ①具体的生命周期过程 ②修改类User ③配置bean ④测试 ⑤bean的后置处理器 bean的作用域 ①概念 在Spring中可以通过配置bean标签的scope属性来指定bean的作用域范围&#xff0c;各取…

Java组合模式:构建多层次公司组织架构

在现实生活中&#xff0c;常常会遇到用树形结构组织的一些场景&#xff0c;比如国家省市&#xff0c;学校班级&#xff0c;文件目录&#xff0c;分级导航菜单&#xff0c;以及典型的公司组织架构&#xff0c;整个层次结构自顶向下呈现一颗倒置的树。这种树形结构在面向对象的世…

23 直接使用 dom api 更新了 #text节点, 之后响应式更新不生效了

前言 这是最近的碰到的那个 和响应式相关的问题 特定的操作之后响应式对象不“响应“了 引起的一系列的文章 主要记录的是 vue 的相关实现机制 呵呵 理解本文需要 vue 的使用基础, js 的使用基础 问题引发自 VueComponent 响应式处理 里面有一段内容, 直接在 console 中…

5月份月刊总结

5月份月刊总结 目录概述需求&#xff1a; 设计思路实现思路分析1.技术经理 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Sur…

我是如何利用业余时间写书的?---时间管理

低级的欲望放纵即可获得&#xff0c;高级的欲望只有克制才能达成。——卡耐基粉丝的误会 很多粉丝&#xff0c;问我&#xff0c; “彭老师你是不是自己创业了&#xff1f;” “彭老师我想报您的培训班。” … 得知我知识业余时间写文章&#xff0c;紧接着又会问&#xff0c; …

python+vue高校体育比赛赛事信息系统

本公共体育赛事管理系统是一个公共体育赛事管理信息的平台&#xff0c;采用vue&#xff0c;MYSQL的开发环境&#xff0c;后台使用python开发架构&#xff0c;并使用django简化对数据库方面的操作&#xff0c;基于B/S结构进行开发。本系统主要实现用户在线进行密码管理&#xff…

[数据集][目标检测]目标检测数据集绝缘子缺陷防震锤1688张5类别VOC格式

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;1688 标注数量(xml文件个数)&#xff1a;1688 标注类别数&#xff1a;5 标注类别名称:["flashover",&…

chatgpt赋能python:Python彩色转黑白简介

Python彩色转黑白简介 Python是一种高级编程语言&#xff0c;提供了许多内置功能和库来进行图像处理。其中之一就是彩色转黑白。彩色图像是RGB&#xff08;红色&#xff0c;绿色和蓝色&#xff09;通道的混合&#xff0c;而黑白图像则只有灰度值。 在本篇文章中&#xff0c;我…

Go 中的随机性测试

&#x1f447;我在这儿 这是关于 Go 语言模糊测试的四部分教程系列的第一部分: 1、Go 语言中的随机测试 2、Go 语言中的模糊测试 3、写一个 Go 语言的模糊测试目标(即将推出) 4、通过模糊化发现漏洞(即将推出) 为我们的 Go 程序选择好的测试用例有点看运气。有时我们很幸运找到…

chatgpt赋能python:Python字符串首字母大写的方法,让你的SEO效果更佳

Python字符串首字母大写的方法&#xff0c;让你的SEO效果更佳 在许多编程语言中&#xff0c;字符串都是一种基本的数据类型。在Python中&#xff0c;字符串是一个非常重要的数据类型&#xff0c;因为在很多情况下&#xff0c;它被用来表示文本。在这篇文章中&#xff0c;我们将…

chatgpt赋能python:Python扫描在SEO中的重要性

Python扫描在SEO中的重要性 Python扫描是一种快速检测网站漏洞和异常的方式&#xff0c;也是SEO方案中不可或缺的一部分。一般来说&#xff0c;Python扫描被用来检测在网站上常见的安全风险&#xff0c;并且使用这种方式可以快速且准确地查找和修复问题。 什么是Python扫描 …

fftw的使用

1、下载编译 官网&#xff1a;http://www.fftw.org/index.html 2、FFT基础知识 2.1 概念 FFT分辨率可以表示为&#xff1a;fs/Nfft 频率分辨率的物理量就是&#xff1a;观测信号的时间窗长度&#xff0c; 时间窗越长&#xff08;N大&#xff09;&#xff0c; 对应频率分辨率…