【CMake基础入门教程】第七课:查找并使用第三方库(以 find_package() 为核心)
很好!我们进入 第七课:查找并使用第三方库(以 find_package()
为核心)。
🎯 本课目标
-
学会使用 CMake 的
find_package()
引入外部库; -
理解
find_package
背后的机制(Config 模式 / Module 模式); -
以常用库如 OpenCV / Qt / Boost 为例进行实战;
-
掌握
target_link_libraries()
的现代 CMake 使用方式。
一、什么是 find_package()
?
CMake 提供 find_package()
来自动查找系统中已安装的第三方库,并导入其头文件路径、库路径等信息。
基本用法:
find_package(OpenCV REQUIRED)
target_link_libraries(my_app PRIVATE ${OpenCV_LIBS})
target_include_directories(my_app PRIVATE ${OpenCV_INCLUDE_DIRS})
📌 如果没找到,CMake 会报错退出(因为有 REQUIRED
)
二、两种查找模式
模式 | 原理 | 举例 |
---|---|---|
Config 模式 | 查找 OpenCVConfig.cmake 文件(现代库都支持) | vcpkg、Qt、OpenCV |
Module 模式 | 查找系统中定义的 FindXXX.cmake 脚本 | Boost、老版库 |
三、以 OpenCV 为例演示(Config 模式)
假设你用 vcpkg 安装 OpenCV:
# 用 vcpkg 安装
vcpkg install opencv4
设置 CMake 使用 vcpkg 路径:
# CMake 命令加上 vcpkg toolchain
cmake .. -DCMAKE_TOOLCHAIN_FILE=D:/vcpkg/scripts/buildsystems/vcpkg.cmake
修改你的 CMakeLists.txt:
find_package(OpenCV REQUIRED)add_executable(my_app main.cpp)
target_link_libraries(my_app PRIVATE ${OpenCV_LIBS})
target_include_directories(my_app PRIVATE ${OpenCV_INCLUDE_DIRS})
四、使用 Boost(Module 模式)
find_package(Boost REQUIRED COMPONENTS filesystem)add_executable(my_app main.cpp)
target_link_libraries(my_app PRIVATE Boost::filesystem)
📌 Boost 有些老版本不是 ::target
的形式,而是用传统变量方式,如:
target_include_directories(my_app PRIVATE ${Boost_INCLUDE_DIRS})
target_link_libraries(my_app PRIVATE ${Boost_LIBRARIES})
五、使用 Qt(现代写法)
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets)add_executable(my_app main.cpp)
target_link_libraries(my_app PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets)
Qt 从 6.x 起完全支持 Config 模式,非常干净。
六、通用现代写法总结
find_package(LibX REQUIRED)
target_link_libraries(my_app PRIVATE LibX::LibX)
👉 关键点是用 target 名称 LibX::LibX
代替手动 include + lib
这种写法更安全、跨平台、不依赖变量。
七、查找路径技巧
有时候找不到库?你可以手动指定路径:
# 设置 OpenCV 安装路径
set(OpenCV_DIR "D:/3rdparty/opencv/build")
find_package(OpenCV REQUIRED)
或者设置环境变量 CMAKE_PREFIX_PATH
:
set CMAKE_PREFIX_PATH=D:/vcpkg/installed/x64-windows/share
✅ 小测验
-
find_package(OpenCV REQUIRED)
找什么文件?✅ 找
OpenCVConfig.cmake
或FindOpenCV.cmake
-
target_link_libraries(app PRIVATE OpenCV::OpenCV)
和target_link_libraries(app PRIVATE ${OpenCV_LIBS})
区别?✅ 前者是现代 CMake 推荐写法,更安全。
-
如果
find_package()
报错没找到,怎么办?✅ 指定
CMAKE_PREFIX_PATH
或XXX_DIR
指明路径。
⏭️ 下一课预告:构建并导出可复用的 CMake 库(export、package、config)
你将学会:
-
写自己的
xxxConfig.cmake
-
如何用
install(EXPORT)
导出库的配置 -
如何让别人用
find_package(MyLib)
找到你做的库!