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)
小结
本章我们学习了:
- find_package 基础:语法和参数
- 查找模式:Module 和 Config 模式
- 使用包:变量方式和目标方式
- 常见包:Boost、OpenCV、Qt、SDL2
- 自定义查找路径
练习
- 查找并链接 Threads 库
- 查找 Boost 并使用其 filesystem 组件
- 编写条件判断,根据包是否找到选择不同的实现