makefile vpath变量
在讲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变量的更多相关文章
- Makefile的变量赋值和函数
在Makefile中的定义的变量,就像是C/C++语言中的宏一样,他代表了一个文本字串,在Makefile中执行的时候其会自动原模原样地 展开在所使用的地方.其与C/C++所不同的是,你可以在Make ...
- makefile之变量赋值
makefile中变量赋值有4种方法: = , := , += , ?= = :直接赋值 变量 = 值 := :位置相关赋值 如果右值为一个值,那么它和=没区别,如果右值为变量,那么左边变 ...
- makefile之变量
1 变量的定义 A variable is a name defined in a makefile to represent a string of text, called the variabl ...
- [转] Makefile 基础 (5) —— Makefile 使用变量
该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...
- Makefile总述②文件命名、包含其他文件makefile、变量、重建重载、解析
Makefile的内容 在一个完整的 Makefile 中,包含了 5 个东西:显式规则.隐含规则.变量定义.指示符和注释. 显式规则:它描述了在何种情况下如何更新一个或者多个被称为目标的文件( Ma ...
- Makefile 自动化变量
Makefile中常用自动化变量解释如下: $@------规则的目标文件名 $<------规则的第一个依赖项文件名 $^------规则的所有依赖文件列表,以空格隔开. $?-------所 ...
- C语言的本质(38)——makefile之变量
我们详细看看Makefile中关于变量的语法规则.先看一个简单的例子: foo = $(bar) bar = Huh? all: @echo$(foo) 我们执行make将会打出Huh?.当make读 ...
- 关于makefile中变量的多次赋值以及override指令
1 基本原则如下 1.1 原则1 变量的普通赋值是有先后顺序的,后面的赋值会覆盖掉前面的赋值. 1.2 原则2 使用的时候,用的是其前面最后的赋值,就算其后面有使用了override指令的赋值也不会影 ...
- Makefile中变量定义中末尾不能有空格
我在Makefile中添加了 ifndef EMASSDIR EMASSDIR=$(shell emassTop.py)endif 但是emassTop.py)后面不小心加入了空格,造成出现“Make ...
随机推荐
- IOCP编程小结(中)
上一篇主要谈了一些基本理念,本篇将谈谈我个人总结的一些IOCP编程技巧. 网络游戏前端服务器的需求和设计 首先介绍一下这个服务器的技术背景.在分布式网络游戏服务器中,前端连接服务器是一种很常见的设计. ...
- 动态编译c#脚本(把c#当作脚本执行)
csscript动态编译C#脚本 This document contains information about the CLR based scripting system CS-Script ( ...
- hdoj5835【水题】
思路:不想说了..具体看代码... #include <iostream> #include <stdio.h> #include <string.h> #incl ...
- python int对象的方法
1.求绝对值 >>> a = -10 >>> a.__abs__() 10 >>> abs(10) 10 2.加法 >>> a ...
- 用hdparm获取硬盘参数
hdparm是Linux下一款能够获取和设置SATA/IDE设备参数的工具. 1.获取硬盘参数 $ sudo hdparm -i /dev/sda$ sudo hdparam -i /dev/sda ...
- influxdb数据库的安装部署(windows)二
1.把下载好的文件解压到目录中 2.以管理员身份运行cmd进入influxdb-1.7.6-1文件夹 3.生成influxdb数据的默认配置Config文件 4.修改Config配置信息 5.用配置好 ...
- P1211 街道赛跑
又是一下午的杠题,累啊~~~ 这道题第一问很简单,只需去掉一个点,判断能不能到达终点就行了: 第二问其实仔细想想也不难,就是判断去掉一个点后是否形成两个图:首先要知道是建立在第一问的基础上的:在加边的 ...
- Cloudera Manager是啥?主要是干啥的?
简单来说,Cloudera Manager是一个拥有集群自动化安装.中心化管理.集群监控.报警功能的一个工具(软件),使得安装集群从几天的时间缩短在几个小时内,运维人员从数十人降低到几人以内,极大的提 ...
- visual studio各版本下载
软件包括以下几种: cn_visual_studio_2010_ultimate_x86_dvd_532347.part1.rar cn_visual_studio_2010_ultimate_x86 ...
- nginx memcache缓存
1 基本 在一个lnmp架构中,nginx遇到动态资源,会反向代理,把请求发送到后端的php-fpm服务,php-fpm从mysql里读取数据,生产网页,然后返回给client. 如果流量大,php- ...