C++学习笔记—find原理
如何在CMake中找到并链接新安装的库
目标
在安装新库后,找出在CMake中find_package
所需的精确包名(包括大小写),并了解如何正确链接该库(优先使用现代CMake目标)。
操作步骤
1. 更新locate
数据库(必做!)
- 操作: 打开终端,运行
sudo updatedb
- 原因: 确保
locate
的数据库包含你刚刚安装的新库的文件信息 - 注意: 如果跳过此步骤,后续步骤可能找不到任何结果
2. 初步定位:查找核心配置文件(Config.cmake
)
- 操作: 运行以下命令(替换
库名关键词
):1
locate -i 'config.cmake' | grep -i '库名关键词'
- 目的: 查找包含
config.cmake
(不区分大小写)且路径中包含指定库名关键词的文件 - 分析结果: 注意文件路径,例如:
/usr/lib/x86_64-linux-gnu/cmake/SomeLib/SomeLibConfig.cmake
/opt/my_libs/lib/cmake/somelib/somelib-config.cmake
3. 确定find_package
名称
- 操作: 从上一步找到的配置文件路径中提取保留原始大小写的包名
- 提取方法: 包名通常位于
.../cmake/
目录之后,是Config.cmake
文件或其所在目录的名称- 例如:
/usr/lib/x86_64-linux-gnu/cmake/SomeLib/SomeLibConfig.cmake
→ 包名为SomeLib
/opt/my_libs/lib/cmake/somelib/somelib-config.cmake
→ 包名为somelib
- 例如:
- 结果: 提取出的精确名称将用于
CMakeLists.txt
中的find_package()
4. 全面查找:找到所有相关的.cmake
文件(可选但推荐)
- 操作: 运行以下命令:
1
locate -i '库名关键词' | grep -i '\.cmake$'
- 目的: 找到所有路径包含库名关键词且以
.cmake
结尾的文件 - 用途: 这有助于了解整个CMake配置的结构
5. 深入检查:查看文件内容,确认链接方式
- 操作:
- 用文本编辑器打开第2步找到的核心
Config.cmake
文件 - 检查是否通过
include()
命令包含了其他.cmake
文件,如有则一并查看
- 用文本编辑器打开第2步找到的核心
- 检查要点:
- 寻找导入目标: 搜索
add_library
关键字,寻找形如add_library(Namespace::Target IMPORTED ...)
的行- 如找到,强烈建议使用现代CMake的链接方式:
target_link_libraries(... Namespace::Target)
- 如找到,强烈建议使用现代CMake的链接方式:
- 寻找变量定义: 搜索
set(
命令,查找版本变量${SomeLib_VERSION}
或包含目录/库变量${SomeLib_INCLUDE_DIRS}
,${SomeLib_LIBRARIES}
- 查看依赖: 注意是否有
find_dependency(...)
命令,了解库是否自动处理依赖 - 阅读注释: 好的配置文件通常包含使用说明
- 寻找导入目标: 搜索
6. 在CMakeLists.txt
中实践
- 操作:
- 使用第3步确定的精确包名调用
find_package
:1
2
3find_package(SomeLib REQUIRED) # 使用大小写正确的名字
# 或者,如果库支持组件:
# find_package(SomeLib REQUIRED COMPONENTS core gui) - 优先使用导入目标(如果在第5步找到):
1
target_link_libraries(your_target PRIVATE SomeLib::core SomeLib::gui)
- 如果找不到导入目标(旧式库):
1
2target_include_directories(your_target PRIVATE ${SomeLib_INCLUDE_DIRS})
target_link_libraries(your_target PRIVATE ${SomeLib_LIBRARIES})
- 使用第3步确定的精确包名调用
核心思想
- 先用
locate
定位关键的*Config.cmake
文件,确定find_package
的官方名称 - 检查配置文件内容,确认链接方式:
- 现代方式:使用导入目标(
Namespace::Target
) - 传统方式:使用包含目录和库变量
- 现代方式:使用导入目标(
- 在实际项目中正确使用找到的库
提示: 虽然
locate
是方便的本地检查工具,但库的官方文档仍然是了解其CMake用法的最权威来源。