IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> cmake find_path -> 正文阅读

[C++知识库]cmake find_path

记录一个camke find_path无法找到指定文件问题

问题描述

现象

尝试使用以下语句搜索 libuio.h头文件

find_path(LIBUIO_INCLUDE_DIR          
  NAMES                               
      libuio.h                        
  PATHS                               
    /home/xx/work/libuio
)       

libuio.h文件实际所在文件路径

/home/xx/work/libuio/libuio

问题说明

  1. 预期:按照find_path语法猜测,cmake是在PATHS中指定的路径搜索NAMES指定的文件,效果应该与直接执行find命令一致。但是实际并未按照预期搜索得到想要的头文件
  2. 实际情况find_path并不会在指定的路径中递归搜索

解决方法

解决方案1:指定完整路径

find_path(LIBUIO_INCLUDE_DIR          
  NAMES                               
      libuio.h                        
  PATHS                               
    /home/chehejia/work/libuio/libuio
)      

解决方案2:使用PATH_SUFFIXES选项

该选项使用场景举例:

  • 如指定搜索路径为/usrPATH_SUFFIXESinclude,则会搜索/usr/usr/include两个路径
find_path(LIBUIO_INCLUDE_DIR          
  NAMES                               
      libuio.h                        
  PATHS                               
    /home/chehejia/work/libuio
  PATH_SUFFIXES
   libuio
)     

官方文档说明

官方文档地址:https://cmake.org/cmake/help/latest/command/find_path.html

find_path(v3.22.1)

find_path (<VAR> name1 [path1 path2 ...])
find_path (
          <VAR>
          name | NAMES name1 [name2 ...]
          [HINTS [path | ENV var]... ]
          [PATHS [path | ENV var]... ]
          [PATH_SUFFIXES suffix1 [suffix2 ...]]
          [DOC "cache documentation string"]
          [NO_CACHE]
          [REQUIRED]
          [NO_DEFAULT_PATH]
          [NO_PACKAGE_ROOT_PATH]
          [NO_CMAKE_PATH]
          [NO_CMAKE_ENVIRONMENT_PATH]
          [NO_SYSTEM_ENVIRONMENT_PATH]
          [NO_CMAKE_SYSTEM_PATH]
          [CMAKE_FIND_ROOT_PATH_BOTH |
           ONLY_CMAKE_FIND_ROOT_PATH |
           NO_CMAKE_FIND_ROOT_PATH]
         )

说明:

  • 此命令用于查找包含指定文件名的目录。

  • 搜索结果被保存到一个cache entry中,如果指定了NO_CACHE选项,则保存到普通变量<VAR>

  • 如果没有找到指定文件,则设置结果为<VAR>-NOTFOUND

  • 选项说明

    • NAMES
      • 指定一个或多个可能的文件名。
      • 当使用此选项指定包含或不包含版本后缀的文件时,我们建议首先指定unversioned name,以便本地构建的软件包可以优先系统软件包被找到。
    • HINTSPATHS
      • 指定默认搜索路径之外的额外搜索路径
      • ENV var子选项,从系统环境变量读取路径
    • PATH_SUFFIXES
      • 指定搜索路径中的额外子路径
      • 举例,如指定文件名为某头文件a.h,指定搜索路径为/usr,指定PATH_SUFFIXESinclude,则除了在/usr目录中查找a.h文件之外,还在/usr/include中查找该文件。默认不递归搜索
    • DOC
      • <VAR>cache entry指定文档字符串
    • NO_CACHE
      • 3.21版本新特性
      • 搜索结果保存在正常变量而不是cache entry
    • REQUIRED
      • 3.18版本新特性
      • 如果未搜索到指定文件,则抛出错误消息,并停止cmake执行过程
    • 搜索路径
      • 如果指定NO_DEFAULT_PATH,则不会增加额外的搜索路径,如果未指定该变量,则搜索执行流程如下:
      • 1. New in version 3.12:如果是从find_packagefind等流程中调用,
        • 则顺序为:<CurrentPackage>_ROOT, ENV{<CurrentPackage>_ROOT}, <ParentPackage>_ROOT, ENV{ParentPackage}_ROOT
        • 如果配置了NO_PACKAGE_ROOT_PATH或将CMAKE_FIND_USE_PACKAGE_ROOT_PATH设置成FALSE,则将跳过该步骤搜索
        • 具体路径为
          • <prefix>/include/<arch>
          • <prefix>/include,其中prefix<PackageName>_ROOTcmake变量和<PackageName>_ROOT环境变量中包含的所有package的prefix路径
      • 2. 搜索cmake指定的cache变量:为了在命令行中指定变量使用,如-DVAR=value,value按都好分割的列表的方式解析
        • 如果配置了NO_CMAKE_PATH或将CMAKE_FIND_USE_CMAKE_PATH设置成FALSE,则将跳过该步骤搜索
      • 3. 搜索camke指定的cmake环境变量:用于使用用户在shell中配置的cmake环境变量
        • 如果配置了NO_CMAKE_ENVIRONMENT_PATH或将CMAKE_FIND_USE_CMAKE_ENVIRONENT_PATH设置成FALSE,则将跳过该步骤搜索
      • 4. 搜索HINTS选项指定的路径:这些应该是由系统推测的路径,例如由已经找到的另一个项的位置提供的提示。硬编码的猜测应该用PATHS选项指定。
      • 5. 搜索标准的系统环境变量
        • 如果配置了NO_SYSTEM_ENVIRONMENT_PATH或将CMAKE_FIND_USE_SYSTEM_ENVIRONENT_PATH设置成FALSE,则将跳过该步骤搜索
      • 6. 搜索当前系统平台文件中定义的cmake变量
        • 如果配置了NO_CMAKE_SYSTEM_PATH或将CMAKE_FIND_USE_CMAKE_SYSTEM_PATH设置成FALSE,则将跳过该步骤搜索
      • 7. 搜索PATHS选项中定义的路径
    • CMake变量CMAKE_FIND_ROOT_PATH指定一个或多个目录作为所有其他搜索目录的前缀。该变量re-root了整个搜索过程到指定位置。默认情况下,CMAKE_FIND_ROOT_PATH为空。
    • CMAKE_SYSROOT变量也可以用来指定一个目录作为搜索目录前缀
    • 上述两个变量在交叉编译时,用于指定搜索根路径很有用。
      • 默认先搜索CMAKE_FIND_ROOT_PATH,之后搜索CMAKE_SYSROOT,最后搜索其他non-rooted路径
      • 通过配置CMAKE_FIND_ROOT_PATH_MODE_INCLUDE变量修改上述搜索行为:
        • CMAKE_FIND_ROOT_PATH_BOTH:按上述顺序搜索
        • NO_CMAKE_FIND_ROOT_PATH:不搜索CMAKE_FIND_ROOT_PATH指定的路径
        • ONLY_CMAKE_FIND_ROOT_PATH:只搜索re-rooted目录和CMAKE_STAGING_PREFIX路径下的目录
  • 默认的搜索顺序设计时考虑了最常用到最不常用的场景,实际工程中可以通过调用多次带有NO_*选项的命令来修改搜索顺序。一旦搜索成功,则结果将被缓存下来。

    find_path (<VAR> NAMES name PATHS paths... NO_DEFAULT_PATH)
    find_path (<VAR> NAMES name)
    
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-26 21:57:27  更:2021-12-26 21:59:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:59:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码