在讲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
多个路径集间用冒号“:”分隔。