如何在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文件,如有则一并查看
  • 检查要点:
    • 寻找导入目标: 搜索add_library关键字,寻找形如add_library(Namespace::Target IMPORTED ...)的行
      • 如找到,强烈建议使用现代CMake的链接方式:target_link_libraries(... Namespace::Target)
    • 寻找变量定义: 搜索set(命令,查找版本变量${SomeLib_VERSION}或包含目录/库变量${SomeLib_INCLUDE_DIRS}, ${SomeLib_LIBRARIES}
    • 查看依赖: 注意是否有find_dependency(...)命令,了解库是否自动处理依赖
    • 阅读注释: 好的配置文件通常包含使用说明

6. 在CMakeLists.txt中实践

  • 操作:
    • 使用第3步确定的精确包名调用find_package:
      1
      2
      3
      find_package(SomeLib REQUIRED) # 使用大小写正确的名字
      # 或者,如果库支持组件:
      # find_package(SomeLib REQUIRED COMPONENTS core gui)
    • 优先使用导入目标(如果在第5步找到):
      1
      target_link_libraries(your_target PRIVATE SomeLib::core SomeLib::gui)
    • 如果找不到导入目标(旧式库):
      1
      2
      target_include_directories(your_target PRIVATE ${SomeLib_INCLUDE_DIRS})
      target_link_libraries(your_target PRIVATE ${SomeLib_LIBRARIES})

核心思想

  1. 先用locate定位关键的*Config.cmake文件,确定find_package的官方名称
  2. 检查配置文件内容,确认链接方式:
    • 现代方式:使用导入目标(Namespace::Target)
    • 传统方式:使用包含目录和库变量
  3. 在实际项目中正确使用找到的库

提示: 虽然locate是方便的本地检查工具,但库的官方文档仍然是了解其CMake用法的最权威来源。