当前位置: 首页 > news >正文

CMake笔记:find_package工作原理

find_package 是 CMake 中用于查找并加载外部库或框架的命令,其工作原理涉及几个关键步骤和搜索策略。以下是 find_package 工作原理的详细解释:

1. 搜索模式

CMake 的 find_package 命令有两种主要的搜索模式:Module 模式和 Config 模式。

  • Module 模式:
    CMake 会在 CMAKE_MODULE_PATH 指定的路径下搜索名为 Find.cmake 的文件。
    如果找到了这个文件,CMake 会执行它,以查找并设置库文件路径、头文件路径以及链接选项等。
    CMAKE_MODULE_PATH 可以通过在 CMakeLists.txt 中使用 list(APPEND CMAKE_MODULE_PATH …) 或 set(CMAKE_MODULE_PATH …) 命令来设置。
  • Config 模式:
    如果 Module 模式未找到库,CMake 会尝试 Config 模式。
    在这种模式下,CMake 会搜索 _DIR 指定的路径下的 Config.cmake 文件,或者搜索系统目录(如 /usr/local/lib/cmake//)中的该文件。
    如果找到了 Config.cmake 文件,CMake 会执行它,以完成库的查找和配置。

2. 搜索顺序和优先级

CMake 默认首先尝试 Module 模式。
如果 Module 模式失败,并且没有显式禁用 Config 模式(通过 NO_MODULE 参数),CMake 会尝试 Config 模式。
在 Config 模式下,CMake 首先会在 _DIR 指定的路径中搜索,然后会在系统目录中搜索。
可以通过设置 CMAKE_PREFIX_PATH 环境变量或 CMake 变量来指定额外的搜索前缀路径,这会影响 Config 模式的搜索顺序。

3. 查找和设置变量

无论使用哪种模式,find_package 命令都会查找并设置一系列变量,以便在项目中使用这些库。
这些变量通常包括 _FOUND(表示库是否找到)、_INCLUDE_DIRS 或 _INCLUDES(头文件目录)、_LIBRARIES(库文件位置)等。
在 Config 模式下,这些变量可能由 Config.cmake 文件直接设置。
在 Module 模式下,这些变量由 Find.cmake 文件设置。

4. 错误处理和可选依赖

如果 find_package 命令找不到指定的库,并且使用了 REQUIRED 参数,CMake 会生成错误信息并停止配置过程。
如果使用了 QUIET 参数,CMake 在找不到库时不会输出错误信息,而是继续执行后续配置。
这对于处理可选依赖特别有用,因为即使找不到这些库,项目也可以继续配置和构建。

5. 自定义查找逻辑

如果 CMake 自带的 Find.cmake 模块不满足需求,用户可以编写自己的查找模块,并将其放在 CMAKE_MODULE_PATH 指定的路径下。
这允许用户根据自己的需求定制查找逻辑,例如指定特定的库版本、搜索特定的路径等。
综上所述,find_package 命令通过结合 Module 模式和 Config 模式、设置搜索路径和优先级、查找和设置变量以及处理错误和可选依赖等机制,为 CMake 项目提供了灵活且强大的外部库查找和加载功能。

参看

https://cmake.org/cmake/help/v3.21/command/find_package.html?highlight=find_package

http://www.xdnf.cn/news/67879.html

相关文章:

  • 如何清理Windows系统中已失效或已删除应用的默认打开方式设置
  • 国产DTU!工业DTU“性能翻倍+功耗减半”双突破!
  • 中科院数据生成赋能具身导航!WCGEN:基于世界一致性数据生成的视觉语言导航
  • 退役淘汰的硬盘数据安全处置不可忽视-硬盘数据抹除清零
  • 目标检测:视觉系统中的CNN-Transformer融合网络
  • LeetCode面试经典 150 题(Java题解)
  • c++_csp-j算法 (3)
  • HXBC编译相关错误
  • 【数论】快速幂
  • 用自然语言指令构建机器学习可视化编程流程:InstructPipe 的创新探索
  • 策略模式:思考与解读
  • 记一次 .NET某旅行社酒店管理系统 卡死分析
  • 剑指offer经典题目(五)
  • 数据库管理-第317期 Oracle 12.2打补丁又出问题了(20250421)
  • SAP系统生产跟踪报表入库数异常
  • SSH反向代理
  • C++——STL——容器deque(简单介绍),适配器——stack,queue,priority_queue
  • 23种设计模式-结构型模式之代理模式(Java版本)
  • Fortran 2008标准引入了多项新特性,其中一些对性能有显著影响一些语言新特征
  • C++--负载均衡在线OJ
  • OpenCV 图形API(48)颜色空间转换-----将 LUV 颜色空间的图像数据转换为 BGR 颜色空间函数LUV2BGR()
  • 在Cursor编辑器上部署MCP(Minecraft Coder Pack)完整指南
  • 进程与线程:02 多进程图像
  • 深入理解React高阶组件(HOC):原理、实现与应用实践
  • 如何测试雷达与相机是否时间同步?
  • 高并发内存池项目
  • EMQX学习笔记
  • ECharts散点图-散点图14,附视频讲解与代码下载
  • Vue3 源码解析(六):响应式原理与 reactive
  • 解决go项目构建后不能夸Linux平台的问题