在讲vpath之前,我们首先了解以下makefile文件。

在类Unix系统中,当我们使用源码编译某个软件的时候,我们会使用confiure,make,make install这三个命令,其中cofigure生成makefile文件,make和make install编译和安装。makefile可以理解为一个脚本文件,使用make命令工具解析,其中定义了一系列的编译规则,如哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译。

那为什么会需要makefile了?

这主要因为编译这项工作随着工程的增大而变得异常的复杂和繁琐,设想如果每一次编译我们都要输入十多条甚至上百条的命令,开发效率将变得多么的低效。而使用makefile,你只需要在makefile中编写好编译规则,而之后的编译工作就只需要输入一个“make”的命令,操作系统就帮我们自动的编译整个工程。

在makefile中有一个vpath的关键字,它用于定义make的查找路径。

make的查找路径默认为当前路径,而在我们的工程中通常会把原文件放置于不同的目录下,这个使用如果要引用某个文件,我们就需要连同文件的目录一块给出,但这就很不方便,比如我们把某个文件移动到了其他的目录下,我们就需要去修改makefile。而vpath可以很好的解决这个问题。

首先介绍vpath的用法

1.vpath <pattern> <directories>

为符合pattern的文件指定directories的搜索路径

2.vpath <pattern>

清除符合pattern文件的搜索路径;

3.vpath

清除所有已设置好的搜索路径。

如: vpath %.h include 表示添加头文件的搜索路径include。其中%表示匹配零个或多个字符。

但有个要注意的地方是:引用文件时使用$<的自动化变量,如我们要编译一个bird.o的文件,定义

vpath %.h include

bird.o:bird.cpp bird.h
g++ -c bird.cpp

bird.h和bird.cpp都在include目录下,这个时候编译时通不过的,而如果把这个改成

vpath %.h include

mesh.o:mesh.cpp mesh.h
g++ -c $<

则可以通过。原因应该是makefile自动化推导的时候会把mesh.cpp比那成./include/bird.cpp,而直接制定bird.cpp则会在当前目录找,结果找不到,编译失败。

makefile还有一个VPAH的变量,也是指定搜索路径的,只不过不能像vpath那样指定文件的匹配模式,这在大型的工程中查找指定文件会比较费时。用法:

VPATH=include:src

多个路径集间用冒号“:”分隔。

makefile vpath变量的更多相关文章

  1. Makefile的变量赋值和函数

    在Makefile中的定义的变量,就像是C/C++语言中的宏一样,他代表了一个文本字串,在Makefile中执行的时候其会自动原模原样地 展开在所使用的地方.其与C/C++所不同的是,你可以在Make ...

  2. makefile之变量赋值

    makefile中变量赋值有4种方法: = ,   := ,  += ,  ?= = :直接赋值 变量 = 值 :=   :位置相关赋值 如果右值为一个值,那么它和=没区别,如果右值为变量,那么左边变 ...

  3. makefile之变量

    1 变量的定义 A variable is a name defined in a makefile to represent a string of text, called the variabl ...

  4. [转] Makefile 基础 (5) —— Makefile 使用变量

    该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...

  5. Makefile总述②文件命名、包含其他文件makefile、变量、重建重载、解析

    Makefile的内容 在一个完整的 Makefile 中,包含了 5 个东西:显式规则.隐含规则.变量定义.指示符和注释. 显式规则:它描述了在何种情况下如何更新一个或者多个被称为目标的文件( Ma ...

  6. Makefile 自动化变量

    Makefile中常用自动化变量解释如下: $@------规则的目标文件名 $<------规则的第一个依赖项文件名 $^------规则的所有依赖文件列表,以空格隔开. $?-------所 ...

  7. C语言的本质(38)——makefile之变量

    我们详细看看Makefile中关于变量的语法规则.先看一个简单的例子: foo = $(bar) bar = Huh? all: @echo$(foo) 我们执行make将会打出Huh?.当make读 ...

  8. 关于makefile中变量的多次赋值以及override指令

    1 基本原则如下 1.1 原则1 变量的普通赋值是有先后顺序的,后面的赋值会覆盖掉前面的赋值. 1.2 原则2 使用的时候,用的是其前面最后的赋值,就算其后面有使用了override指令的赋值也不会影 ...

  9. Makefile中变量定义中末尾不能有空格

    我在Makefile中添加了 ifndef EMASSDIR EMASSDIR=$(shell emassTop.py)endif 但是emassTop.py)后面不小心加入了空格,造成出现“Make ...

随机推荐

  1. IOCP编程小结(中)

    上一篇主要谈了一些基本理念,本篇将谈谈我个人总结的一些IOCP编程技巧. 网络游戏前端服务器的需求和设计 首先介绍一下这个服务器的技术背景.在分布式网络游戏服务器中,前端连接服务器是一种很常见的设计. ...

  2. 动态编译c#脚本(把c#当作脚本执行)

    csscript动态编译C#脚本 This document contains information about the CLR based scripting system CS-Script ( ...

  3. hdoj5835【水题】

    思路:不想说了..具体看代码... #include <iostream> #include <stdio.h> #include <string.h> #incl ...

  4. python int对象的方法

    1.求绝对值 >>> a = -10 >>> a.__abs__() 10 >>> abs(10) 10 2.加法 >>> a ...

  5. 用hdparm获取硬盘参数

    hdparm是Linux下一款能够获取和设置SATA/IDE设备参数的工具. 1.获取硬盘参数 $ sudo hdparm -i /dev/sda$ sudo hdparam -i /dev/sda ...

  6. influxdb数据库的安装部署(windows)二

    1.把下载好的文件解压到目录中 2.以管理员身份运行cmd进入influxdb-1.7.6-1文件夹 3.生成influxdb数据的默认配置Config文件 4.修改Config配置信息 5.用配置好 ...

  7. P1211 街道赛跑

    又是一下午的杠题,累啊~~~ 这道题第一问很简单,只需去掉一个点,判断能不能到达终点就行了: 第二问其实仔细想想也不难,就是判断去掉一个点后是否形成两个图:首先要知道是建立在第一问的基础上的:在加边的 ...

  8. Cloudera Manager是啥?主要是干啥的?

    简单来说,Cloudera Manager是一个拥有集群自动化安装.中心化管理.集群监控.报警功能的一个工具(软件),使得安装集群从几天的时间缩短在几个小时内,运维人员从数十人降低到几人以内,极大的提 ...

  9. visual studio各版本下载

    软件包括以下几种: cn_visual_studio_2010_ultimate_x86_dvd_532347.part1.rar cn_visual_studio_2010_ultimate_x86 ...

  10. nginx memcache缓存

    1 基本 在一个lnmp架构中,nginx遇到动态资源,会反向代理,把请求发送到后端的php-fpm服务,php-fpm从mysql里读取数据,生产网页,然后返回给client. 如果流量大,php- ...