deepwzh的技术笔记
  • Golang
  • Python
  • Cpp
杂项
前端开发
  • 计算机网络
  • 操作系统
  • 数据库
云原生
Devops
AIGC
关于作者
  • Golang
  • Python
  • Cpp
杂项
前端开发
  • 计算机网络
  • 操作系统
  • 数据库
云原生
Devops
AIGC
关于作者
  • Cpp
  • c++ 模块
  • 类

    • 类
    • 友元
  • 开发工具

    • 开发工具
    • Vscode

      • Vscode
      • vscode 相关插件
  • 协程

    • 协程
    • test
  • 构建工具

    • 构建工具
    • Make
    • Cmake

      • Cmake
      • 常见问题
      • cmake 基本用法
      • cmake 集成 conan
      • cmake 生成器
      • cmake 库查找
  • 链接库

    • 链接库
    • 动态链接库
  • 编译器

    • 编译器
    • gcc

      • gcc
      • 常用选项
  • 包管理工具

    • 包管理工具
    • Canan

cmake 库查找

find_package

find_package 命令用于在系统上查找位于 CMake 模块路径中的库并导入其设置。对于许多常用的开源库,CMake 都提供了预定义模块,其中包括库的搜索逻辑和导入所需的其他设置。

默认导入位置:/usr/local/lib/cmake/

详细配置参加文档:cmake-modules(7) ‒ CMake 3.26.3 Documentation

该命令有几种模式可用于搜索软件包:

模式

find_package 支持多种模式

模块模式

在此模式下,CMake 会搜索名为 Find<PackageName>.cmake 的文件,首先查找 CMAKE_MODULE_PATH 中列出的位置,然后在 CMake 安装提供的查找模块中查找。如果找到该文件,则由 CMake 读取和处理。它负责查找软件包、检查版本并生成任何所需消息。某些 Find 模块对版本控制提供了有限或没有支持;请检查 Find 模块的文档。

通常情况下,Find<PackageName>.cmake 文件不是由软件包本身提供的。相反,它通常是由一些外部因素(如操作系统、CMake 本身或甚至调用 find_package()命令的项目)提供的。作为外部提供者,Find Modules 往往具有启发性,并容易过时。它们通常会搜索特定库、文件和其他软件包工件。

只有基本命令签名支持模块模式。

配置模式

在此模式下,CMake 会搜索名为 <lowercasePackageName>-config.cmake 或 <PackageName>Config.cmake 的文件。如果指定了版本详细信息(请参见“配置方式版本选择”以获取这些单独版本文件使用说明),还将寻找 <lowercasePackageName>-config-version.cmake 或 <PackageName>ConfigVersion.cmake 文件。

在配置方式下,可以向该命令给出要作为软件包名称搜索的名称列表。CMake 搜索配置和版本文件的位置比模块模式要复杂得多(请参见“配置方式搜索过程”)。

配置和版本文件通常作为软件包的一部分安装,因此它们往往比 Find Modules 更可靠。它们通常包含有关软件包内容的直接知识,因此在配置或版本文件本身中不需要进行任何搜索或启发式操作。

基本命令签名和完整命令签名都支持配置模式。

FetchContent 重定向模式

自 3.24 版起:可以将对 find_package() 的调用内部重定向到由 FetchContent 模块提供的一个软件包。对于调用者而言,行为类似于配置方式,但是跳过了搜索逻辑并且不使用组件信息。有关详细信息,请参见 FetchContent_Declare() 和 FetchContent_MakeAvailable() 。

与其他包管理器集成

conan

使用 CMakeDeps 生成器, 可以生成更现代的 XXXConfig.cmake 文件,支持 CMake 的 find_package 和 target_link_libraries

[generators]
CMakeDeps

然后就可以通过 CMake 直接使用了

find_package(Boost REQUIRED)
target_link_libraries(my_target PRIVATE boost::boost)

参考资料

CMake I 细谈 find_package 函数_烫青菜的博客-CSDN 博客

https://zhuanlan.zhihu.com/p/97369704

Prev
cmake 生成器