zoukankan      html  css  js  c++  java
  • 第十六篇 make中的路径搜索

     在实际的工程项目中,源文件和头文件都会组织成一定的目录结构,这样也便于项目的管理,前述我们分析的makefile,源文件和头文件大都在当前目录,没有路径搜索的问题,下面我们引入今天的演示程序的目录结构:
     
    编写makefile并执行make,结果如下:
     
    由于源文件和头文件都组织在了文件夹里,但是make解释器却一无所知,因此,只能报错找不到对应的文件。
    我们可以引入特殊的预定义变量VPATH,具体如下:
     
    make对于VPATH值得处理方式如下:
    1、当前文件夹找不到需要的文件时,VPATH会被使用。
    2、make会在VPATH指定的文件夹中依次搜索文件。
    3、当多个文件夹存在同名文件时,选择第一次搜索到的文件。
     
    修改makefile,添加VPATH,执行make结果如下:
     
    我们可以看到,这次是gcc报的错误,提示找不到func.h,虽然我们指定了VPATH搜索路径,但是这只是用于告诉make解释器去哪里寻找文件,gcc在预处理时,依然不知道头文件在何处。我们需要通过gcc的-I选项来告诉gcc去哪里寻找头文件。
    更改后的makefile和执行结果如下:
     
    小知识:gcc 编译时可以使用 -I 选项指定头文件的搜索路径, GCC的预处理器在实际操作时,会首先去 -I 选项指定的路径下搜索头文件,搜索不到时,再去与源文件相同的路径下搜索,还是搜索不到的话就报错。
     
    通过VPATH变量,我们解决了路径搜索的问题,但是VPATH是个双刃剑,如果由于误操作我们将源文件放到了inc文件夹中,那在实际编译时可能就会得到意想不到的结果。
    我们可以使用vpath关键字来代替VPATH变量,它具有更好的效果:
     
    vpath关键字的使用比较灵活,可以设置搜索路径,也可以取消搜索路径的设置,如下所示:
     
    如果只写一个vpath关键字,则取消所有已经设置的搜索规则。
     
    我们来考察一些VPATH和vpath的常见问题:
    1、当VPATH和vpath同时出现时,make会如何处理?考虑如下的项目结构:
     
    上述项目结构对应的makefile以及执行结果如下:
     
    src1和src2文件夹中都有func.c文件,由以上的实验现象可知,make首先搜索src2,当src2中func.c不存在时,make再去搜索src1。实验结论如下:
     
    2、当使用vpath同时对一个模式指定多个文件夹时,make会如何处理?
    在上一个makefile程序中做简单修改,并执行make,结果如下:
     
    可见这次首先搜索的是src1文件夹,只有在src1文件夹中索搜不到时才会去src2文件夹中搜索。
    结论如下:
     
    3、通过VPATH指定搜索路径后,make如何决定目标文件的最终位置
    编写如下的makefile,执行make,目标文件生成到了当前目录,如下所示:
     
    将app.out移到src中,再次执行make,提示文件是最新的。可见make解释器在执行解释前,先在当前目录下搜索是否存在app.out,如果不存在,则根据VPATH的指示,去src文件夹搜索是否存在app.out,如果存在,则对比与依赖文件的新旧关系,然后决定是否执行重新编译链接。
     

    VPATH的具体解释如下:
    VPATH变量:
        VPATH变量指定搜索路径,例如,指定为src,此时,若src下和当前路径下没有目标文件,则在当前路径下生成;若src下有目标文件,
    且新旧关系不变,则不会重新生成目标文件;若src下有目标文件,且新旧关系已经改变,则在当前文件夹下生成目标文件。   
        当同时指定GPATH为src,此时,若src下和当前路径下没有目标文件,则在当前路径下生成;若src下有目标文件,
    且新旧关系不变,则不会重新生成目标文件;若src下有目标文件,且新旧关系已经改变,则在src文件夹下生成目标文件。
     
    小结:
       1、尽量使用vpath为不同文件指定搜索路径。
       2、不要在源码文件夹中生成目标文件。
       3、为编译得到的结果创建独立的文件夹。
       4、工程中尽量避免VPATH和GPATH特殊变量的使用。
     
    参考如下:
       狄泰软件教程及课件
       gun make手册
       专业嵌入式软件开发
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    高速排序
    [小米] 并查集
    Mysql5.7新特性
    双链表删除/插入节点
    【LeetCode-面试算法经典-Java实现】【144-Binary Tree Preorder Traversal(二叉树非递归前序遍历)】
    Repractise基础篇:Web应用开发七日谈
    [leetcode] Palindrome Number(不使用额外空间)
    SpringFox 初体验
    用RegularJS开发小程序 — mpregular解析
    MySQL Group Replication数据安全性保障
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/8427904.html
Copyright © 2011-2022 走看看