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)