Makefile基础教程(路径搜索)

news/2024/11/8 11:56:43/

文章目录

  • 前言
  • 一、常用的源码管理方式
  • 二、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 := gccVPATH := inc srchello : 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 := gccvpath %.h inc
vpath %.c srchello : 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 := gccvpath %.h inc
vpath %.c src
VPATH := src1hello : main.c main.h$(CC) -c -o $@ $< -I inc

四、vpath指定多个文件夹

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

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

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

CC := gccvpath %.h inc
vpath %.c src
vpath %.c src1
vpath %.c src2hello : main.c main.h$(CC) -c -o $@ $< -I inc

总结

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


http://www.ppmy.cn/news/93362.html

相关文章

通过人工智能制定的HTML的零基础的详细学习计划

HTML&#xff08;Hypertext Markup Language&#xff09;是一种用于创建网页和Web应用程序的标记语言。如果你想从零开始学习HTML&#xff0c;下面是一个详细的学习计划&#xff1a; 学习资料&#xff1a; HTML官方教程 慕课网HTML入门教程 W3Schools在线教程 书籍…

MySQL运维篇(一)

一.日志 1.1 错误日志 错误日志是 MySQL 中最重要的日志之一&#xff0c;它记录了当 mysqld 启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时&#xff0c;建议首先查看此日志。 错误日志是默认开启的…

PAT A1069 The Black Hole of Numbers

1069 The Black Hole of Numbers 分数 20 作者 CHEN, Yue 单位 浙江大学 For any 4-digit integer except the ones with all the digits being the same, if we sort the digits in non-increasing order first, and then in non-decreasing order, a new number can be o…

MySQL索引详解(IT枫斗者)

MySQL索引详解 什么是索引 官方介绍索引是帮助MySQL高效获取数据的数据结构。简单来讲&#xff0c;数据库索引就像是书前面的目录&#xff0c;能加快数据库的查询速度。事实上&#xff0c;索引是一种数据结构&#xff0c;用于帮助我们在大量数据中快速定位到我们想要查找的数…

Linux中设置动态库的路径

Linux中设置动态库的路径 例如&#xff1a;在Ubantu对项目进行编译的时候出现&#xff1a; error while loading shared libraries: libmpc.so.3: cannot open shared object file: No such file or directory。 但是在使用 find 去对 libmpc.so.3 库进行查找&#xff0c;发现…

【利用AI让知识体系化】深入浅出Puppeteer

文章目录 1. Puppeteer简介1.1 什么是Puppeteer1.2 它能做什么Puppeteer能够完成以下一些主要的操作&#xff1a;1.3 为什么要使用Puppeteer 2. 安装和配置Puppeteer2.1 安装Puppeteer2.2 配置Puppeteer2.3 第一个Puppeteer程序 3. Puppeteer的基础功能3.1 打开和关闭浏览器3.2…

Pinctrl子系统_01_Pinctrl子系统介绍

本节介绍在Pinctrl子系统中&#xff0c;将会学习哪些内容。 Pinctrl作用 Pinctrl&#xff1a;Pin Controller&#xff0c;顾名思义&#xff0c;就是用来控制引脚的。 一个芯片有成百上千个引脚&#xff0c;这些引用要怎么配置&#xff0c;配置成什么功能&#xff0c;都是通P…

[快速入门前端17] CSS 选择器(6) 选择器总结

基本选择器 选择器说明语法通配符作用范围为所有标签&#xff0c;用于页面整体样式* { color: red }元素作用于同种标签&#xff0c;不能进行差异化样式设定p { color: red }类别作用于我们自行设定的类别&#xff0c;是使用频率最高的选择器.myClass { color: red }ID选取当前…