zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    Leetcode 15 3Sum
    Leetcode 383 Ransom Note
    用i个点组成高度为不超过j的二叉树的数量。
    配对问题 小于10 1.3.5
    字符矩阵的旋转 镜面对称 1.2.2
    字符串统计 连续的某个字符的数量 1.1.4
    USACO twofive 没理解
    1002 All Roads Lead to Rome
    USACO 5.5.1 求矩形并的周长
    USACO 5.5.2 字符串的最小表示法
  • 原文地址:https://www.cnblogs.com/xin-lover/p/8934158.html
Copyright © 2011-2022 走看看