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 ...
随机推荐
- LA-3905 (扫描线)
题意: 给一些流星的初始位置和运动向量,给了相机的拍摄范围;问你最多能拍到多少颗流星; 思路: 将流星用出现在相机拍摄范围内的时间段表示;sort后在扫面端点更新最大值; Ac代码: #include ...
- 「LuoguP1799」 数列_NOI导刊2010提高(06)
题目描述 虽然msh长大了,但她还是很喜欢找点游戏自娱自乐.有一天,她在纸上写了一串数字:1,1,2,5,4.接着她擦掉了一个l,结果发现剩下1,2,4都在自己所在的位置上,即1在第1位,2在第2位, ...
- 【扬中集训Day6T1】 白日梦
[题目描述] 白日梦 (daydream.c/cpp/pas) 时间限制: 1 s 空间限制: 256 MB 题目描述 SR需要相当大的睡眠量 某日,他做了一个奇怪的梦,他梦见自己成为了怪物猎人,为 ...
- 哈希表的C实现(三)---传说中的暴雪版
关于哈希表C实现,写了两篇学习笔记,不过似乎网上流传最具传奇色彩的莫过于暴雪公司的魔兽文件打包管理器里的hashTable的实现了:在冲突方面的处理方面,采用线性探测再散列.在添加和查找过程中进行了三 ...
- Centos7 编译安装 Nginx、MariaDB、PHP
前言 本文主要大致介绍CentOS 7下编译安装Nginx.MariaDB.PHP.面向有Linux基础且爱好钻研的朋友.技艺不精,疏漏再所难免,还望指正. 环境简介: 系统: CentOS 7,最小 ...
- Codeforces703B Mishka and trip
题意: 就是有n个点,本来相邻点之间就有一条边,1和n之间也有一条,然后给你几个特殊点,说这些特殊点和其他所有点都连起来了,然后算一个所有边的权值和,每条边的权值等于两个点的c相乘. 思路: 水题啊- ...
- 第十四篇 .NET高级技术之反射
两个现实中的例子:1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况.这是如何做到的呢?B超是B型超声波,它可以透过肚皮通过向你体内发射B型超声波,当超声波遇到内脏壁的时 ...
- 51Nod 1179 最大的最大公约数(暴力大法好)
#include <iostream> #include <cstdio> #include <cstring> using namespace std; ; in ...
- macos php安装扩展sqlsrv连接sqlserver
Install the PHP Drivers for SQL Serve sudo pecl install pdo_sqlsrv sudo pecl install sqlsrv 微软官方文档 ...
- Cake slicing UVA - 1629
UVA - 1629 ans[t][b][l][r]表示t到b行,l到r列那一块蛋糕切好的最小值d[t][b][l][r]表示t到b行,l到r列区域的樱桃数,需要预处理 #include<cst ...