跳到主要内容

CMake 查找依赖

本章将介绍如何使用 find_package 和相关命令查找和配置外部依赖。

find_package 基础

基本语法

find_package(PackageName [version] [EXACT] [QUIET] [REQUIRED]
[COMPONENTS components...]
)

参数说明

参数说明
version要求的最低版本
EXACT要求精确版本匹配
QUIET不显示查找状态信息
REQUIRED必须找到,否则报错
COMPONENTS指定需要的组件

查找模式

Module 模式

使用 Find<Package>.cmake 模块文件:

# 查找模块文件位置
cmake --help-module-list | grep Find

# 使用示例
find_package(OpenCV REQUIRED)
target_link_libraries(myapp ${OpenCV_LIBS})

Config 模式

使用 <Package>Config.cmake 文件:

find_package(fmt REQUIRED)
target_link_libraries(myapp fmt::fmt)

使用找到的包

传统变量方式

find_package(OpenCV REQUIRED)

target_include_directories(myapp PRIVATE ${OpenCV_INCLUDE_DIRS})
target_link_libraries(myapp ${OpenCV_LIBS})

现代目标方式(推荐)

find_package(Threads REQUIRED)
target_link_libraries(myapp PRIVATE Threads::Threads)

find_package(fmt REQUIRED)
target_link_libraries(myapp PRIVATE fmt::fmt)

find_package(Boost COMPONENTS filesystem REQUIRED)
target_link_libraries(myapp PRIVATE Boost::filesystem)

常见包示例

Boost

find_package(Boost 1.70 REQUIRED COMPONENTS
filesystem
system
thread
)

target_link_libraries(myapp PRIVATE
Boost::filesystem
Boost::system
Boost::thread
)

OpenCV

find_package(OpenCV REQUIRED)

target_include_directories(myapp PRIVATE ${OpenCV_INCLUDE_DIRS})
target_link_libraries(myapp PRIVATE ${OpenCV_LIBS})

Qt

find_package(Qt6 REQUIRED COMPONENTS
Core
Widgets
Network
)

target_link_libraries(myapp PRIVATE
Qt6::Core
Qt6::Widgets
Qt6::Network
)

SDL2

find_package(SDL2 REQUIRED)

target_include_directories(myapp PRIVATE ${SDL2_INCLUDE_DIRS})
target_link_libraries(myapp PRIVATE ${SDL2_LIBRARIES})

检查查找结果

find_package(SomePackage)

if(SomePackage_FOUND)
message(STATUS "Found SomePackage: ${SomePackage_VERSION}")
target_link_libraries(myapp SomePackage::SomePackage)
else()
message(STATUS "SomePackage not found, using fallback")
# 使用备选方案
endif()

指定查找路径

# 设置查找路径
set(CMAKE_PREFIX_PATH "/opt/custom/libs")

# 或使用环境变量
# export CMAKE_PREFIX_PATH=/opt/custom/libs

find_package(MyLib REQUIRED)

小结

本章我们学习了:

  1. find_package 基础:语法和参数
  2. 查找模式:Module 和 Config 模式
  3. 使用包:变量方式和目标方式
  4. 常见包:Boost、OpenCV、Qt、SDL2
  5. 自定义查找路径

练习

  1. 查找并链接 Threads 库
  2. 查找 Boost 并使用其 filesystem 组件
  3. 编写条件判断,根据包是否找到选择不同的实现