很好!我们进入 第七课:查找并使用第三方库(以 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、老版库 |
# 用 vcpkg 安装
vcpkg install opencv4
# CMake 命令加上 vcpkg toolchain
cmake .. -DCMAKE_TOOLCHAIN_FILE=D:/vcpkg/scripts/buildsystems/vcpkg.cmake
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})
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})
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
指明路径。
你将学会:
写自己的 xxxConfig.cmake
如何用 install(EXPORT)
导出库的配置
如何让别人用 find_package(MyLib)
找到你做的库!