Makefile中的文件搜索路径(VPATH和vpath)

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。

前言

当源文件与 Makefile 文件的存放路径不同时,如何将源文件的路径告知Makefile文件呢?

方法有两种:一般搜索VPATH,选择搜索vpath

两者的本质不同:VPATH 是环境变量,是Makefile 中的一种特殊变量,使用时需要指定文件的路径;而 vpath 是关键字,按照模式搜索,或者说选择搜索,搜索的时候不仅需要加上文件的路径,还需要加上相应限制的条件。

使用什么样的搜索方法,主要是基于编译器的执行效率。当路径下的文件较少,或者是搜索的文件不能使用通配符表示时,使用VPATH最好。但是如果路径下的文件很多,或者可以使用通配符时,建议使用vpath。因为 VPATH 在搜索文件时没有附加限制条件,它会检索目录下的所有文件,每一个文件都会进行对比,速度慢,效率低;而 vpath 搜索包含搜索条件,过滤掉那些不符合条件的文件,而从规定的条件中搜索目标,查找效率高。

 VPATH的使用

在 Makefile 中可以这样写:

VPATH := src

把 src 的值赋值给变量 VPATH,在执行 make 的时候会从 src 目录寻找我们需要的文件。

当存在多个路径时,可以这样写:

VPATH := src car       或       VPATH := src:car

多个路径之间要使用空格或者是冒号隔开,表示在多个路径下搜索文件。搜索的顺序为我们书写时的顺序。

执行 make 时,先搜索当前目录下的文件,找到的话就使用当前目录下的文件,找不到的话才去 VPATH 指定的路径中寻找。

实例:

VPATH=src car
test:test.ogcc -o $@ $^

假设 test.c 文件没有在当前的目录,而是在当前文件的子目录 "src" 或者是 "car" 下,程序执行也是没有问题的,但是生成的 test 文件是在当前的目录下。当然生成文件路径可以指定。

vpath的使用

vpath也被称作“选择性搜索”。VPATH 是搜索路径下所有的文件,而 vpath 更像是添加了限制条件,会过滤出一部分再去寻找。

PATTERN可以理解为要寻找的文件,而DIRECTORIES表示寻找的路径。

1、用法一

命令格式

vpath PATTERN DIRECTORIES 

实例:在 src 路径下搜索文件 test.c。

vpath test.c src

多路径的书写规则如下:

vpath test.c src car    或    vpath test.c src : car

2、用法二

命令格式

vpath PATTERN

实例:清除符合文件 test.c 的搜索目录。(从搜索路径集中去掉将test.c文件所在的目录?)

vpath test.c

3、用法三

命令格式

vpath

vpath单独使用的意思是清除所有(已被设置的)文件搜索路径。

在使用 vpath 的时候,搜索的条件中可以包含模式字符“%”,这个符号的作用是匹配一个或者是多个字符,例如“%.c”表示搜索路径下所有的 .c 结尾的文件。

使用举例

src文件夹(list1.c、list2.c、main.c 文件)、include 文件夹(list1.h、list2.h 文件)、Makefile文件,这三者处于同层目录中。

其中Makefile 文件内容:

main:main.o list1.o list2.ogcc -o $@ $<
main.o:main.cgcc -o $@ $^
list1.o:list1.c list1.hgcc -o $@ $<
list2.o:list2.c list2.hgcc -o $@ $<

执行 make 时出现错误而编译停止,错误提示:

make:*** No rule to make target 'main.c',need by 'main.o'. stop.

重建最终目标文件 main 的时候需要 main.o 文件,然而去重建目标main.o 文件时,没有找到指定的 main.c 文件,这是错误的根本原因。所以我们可以为其添加文件搜索路径。

VPATH=src include               #方法1
main:main.o list1.o list2.ogcc -o $@ $<
main.o:main.cgcc -o $@ $^
list1.o:list1.c list1.hgcc -o $@ $<
list2.o:list2.c list2.hgcc -o $@ $<
vpath %.c src
vpath %.h include              #方法2
main:main.o list1.o list2.ogcc -o $@ $<
main.o:main.cgcc -o $@ $^
list1.o:list1.c list1.hgcc -o $@ $<
list2.o:list2.c list2.hgcc -o $@ $<

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

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

相关文章

今天是我开通博客的第一天

The first time I regist my blog.转载于:https://www.cnblogs.com/binquan/p/3417169.html

mysql导入sql文件过大或连接超时的解决办法

原文:mysql导入sql文件过大或连接超时的解决办法 前段时间出差在现场开发的时候&#xff0c;导入数据库老是出问题。最后发现了一个神奇sql语句交给实施&#xff0c;只要导入出错就把如下语句执行就可以了。至今屡试不爽。 set global max_allowed_packet100 000 000; set glob…

Makefile中的条件判断

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 日常使用 Makefile 编译文件时&#xff0c;可能会遇到需要分条件执行的情况。比如在一个工程文件中可编译的源文件很多&#xff0c;但是它们的类型是不相同的&#xff0c;所以编译文件…

SSH框架介绍

SSH 为 strutsspringhibernate的一个集成框架&#xff0c;是目前较流行的一种Web应用程序开源框架。 定义 集成SSH框架的系统从职责上分为四层&#xff1a;表示层、业务逻辑层、数据持久层和域模块层&#xff0c;以帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的We…

Find Minimum in Rotated Sorted Array

Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). Find the minimum element. You may assume no duplicate exists in the array. 思路&#xff1a;如果中间节点的值最大&#xff0c;则取后半…

Makefile的伪目标

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 伪目标&#xff0c;它的目的并不是创建目标文件&#xff08;所以称作“伪”&#xff09;&#xff0c;而是想去执行这个目标下面的命令。它有点像汇编语言里的标签。 使用伪目标的原因&…

Makefile中的文件包含

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 Makefile 中包含其他的文件&#xff0c;使用的关键字是 "include"。 make 读取到 "include" 关键字时&#xff0c;会暂停读取当前的 Makefile&#xff0c;转去读取…

Eclipse高级使用技巧

1&#xff0e; Eclipse的配置文件导入和导出功能 说明&#xff1a;可以将Eclipse的自定义的工作空间配置文件导出和导入&#xff0c;这样创建多工作空间时候就省去了再设置的烦恼。 2&#xff0e; Eclipse设置显示行号 说明&#xff1a;设置文件现实行号&#xff0c;调试错误的…

hadoop hive 的安装问题

origin: http://blog.163.com/songyalong1117126/blog/static/1713918972014124481752/hadoop hive 的安装问题 2014-02-24 16:10:13| 分类&#xff1a; hadoop|举报|字号 订阅能了一下午终于把hive搞好了&#xff0c;其中出现很多的问题1、hadoop和hive的版本问题&#xff0…

熬之滴水成石:最想深入了解的内容--windows内核机制(6)

58 进程和线程&#xff08;3&#xff09; 说完进程再说说线程&#xff0c;线程相比于进程其实有更多可说的内容。首先实现线程调用的数据结构是个栈&#xff0c;该栈记录了调用方法的信息这里面也包括了函数调用及返回的地址。线程肯定是属于某个进程&#xff0c;其控制流可以访…

Google搜索技巧总结

http://blog.sciencenet.cn/blog-44407-229042.html转载于:https://www.cnblogs.com/aze-003/p/4105261.html

【linux】学习6

鸟哥13章的东西 shell script速度较慢&#xff0c;适合用于系统管理&#xff0c;但不适合处理大量数值运算 var$((运算内容)) 可以用来做变量的加减乘除求余运算 total$(($firstnum*$secnu)) declare -i total"$firstnum*$secnu" 上面两句功能一样&#xff0c;建议用…

Makefile嵌套执行make

概述 在一个大的工程文件中&#xff0c;不同的文件按照功能被划分到不同的模块中&#xff0c;每个模块可能都会有自己的编译顺序和规则。如果在一个 Makefile 文件中描述所有模块的编译规则&#xff0c;就会显得很杂乱&#xff0c;执行时也会很不方便。 如果在不同的模块中分别…

core--线程同步(内核模式)

什么是内核&#xff1f;windows操作系统为了更好的管理进程&#xff0c;线程&#xff0c;创建了很多数据结构&#xff0c;这些数据结构运行在windows的底层&#xff0c;并不开放给开发人员&#xff1b;所以开发人员称这些结构为内核&#xff0c;但是为了开发人员能够使用&#…

hive cli启动判断hadoop version的问题

测试环境的hive cli启动时报错&#xff1a;Unable to determine Hadoop version information.hive是一个shell:使用sh -x跟踪运行过程&#xff0c;可以看到其通过hadoop version获取hdfs的版本相关的代码如下&#xff1a;# Make sure were using a compatible version of Hadoo…

Makefile变量的高级用法:变量的替换引用、变量的嵌套使用

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 我们之前已经学习过变量的定义和基本的赋值运算&#xff0c;我们可以更深入的了解一下变量的一些高级的用法。高级使用方法有两种&#xff1a;第一种是变量的替换引用&#xff0c;第二…

SAP Study Notes: BW Queriy-Variables(变量)

About Variable:1.Variable 是和InfoObject绑定的&#xff0c;可用于任何含有该IO的query中。2.Variable有以下几种类型&#xff1a;Characteristic&#xff1a;用于限制Char。 Text&#xff1a;用于在报表动态显示文本。 Hierarchy&#xff1a;用于限制Hierarchy。 Hieararchy…

Makefile中的通配符

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 Makefile 是可以使用 shell 命令的&#xff0c;所以 shell 支持的通配符在 Makefile 中也是同样适用的。 shell 中使用的通配符有&#xff1a;"*"&#xff0c;"?&qu…

SCCM2012 R2集成WSUS服务器-4:部署软件更新组

在之前的文章中&#xff0c;我们已经创建好的软件更新组&#xff0c;也下载好了补丁&#xff0c;下面我们来部署这些补丁。右击软件更新组&#xff0c;选择”部署“&#xff0c;如图。进入到部署软件更新向导&#xff0c;输入部署的名称&#xff0c;并指定部署的集合。如图。在…

JavaScript Iframe富文本编辑器中的光标定位

最近在项目中碰到一个比较棘手的问题&#xff1a; 在iframe富文本编辑器中&#xff0c;有个工具栏&#xff0c;这个工具栏在iframe标签之外&#xff0c;工具栏上有一个按钮&#xff0c;点击该按钮向iframe正在编辑中的光标处插入一个图片&#xff0c;图片会插入到当前光标所在的…