当前位置: 首页 > news >正文

【CMake基础入门教程】第七课:查找并使用第三方库(以 find_package() 为核心)

很好!我们进入 第七课:查找并使用第三方库(以 find_package() 为核心)


🎯 本课目标

  1. 学会使用 CMake 的 find_package() 引入外部库;

  2. 理解 find_package 背后的机制(Config 模式 / Module 模式);

  3. 以常用库如 OpenCV / Qt / Boost 为例进行实战;

  4. 掌握 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

✅ 小测验

  1. find_package(OpenCV REQUIRED) 找什么文件?

    ✅ 找 OpenCVConfig.cmakeFindOpenCV.cmake

  2. target_link_libraries(app PRIVATE OpenCV::OpenCV)target_link_libraries(app PRIVATE ${OpenCV_LIBS}) 区别?

    ✅ 前者是现代 CMake 推荐写法,更安全。

  3. 如果 find_package() 报错没找到,怎么办?

    ✅ 指定 CMAKE_PREFIX_PATHXXX_DIR 指明路径。


⏭️ 下一课预告:构建并导出可复用的 CMake 库(export、package、config)

你将学会:

  • 写自己的 xxxConfig.cmake

  • 如何用 install(EXPORT) 导出库的配置

  • 如何让别人用 find_package(MyLib) 找到你做的库!


相关文章:

  • 数字孪生技术驱动UI前端变革:从静态展示到动态交互的飞跃
  • 面试150 判断子序列
  • Jenkins执行Jenkinsfile报错
  • 频宽是什么: 0.35/Tr、0.5/Tr?
  • Spring AI Alibaba
  • windows下 tomcat的安装部署
  • 多租户多会话隔离存储架构的完整实现方案
  • GNSS位移监测站在大坝安全中的用处
  • 物联网与低代码:Node-RED如何赋能工业智能化与纵横智控的创新实践
  • Java常用设计模式详解
  • TCP 重传机制详解:原理、变体与故障排查应用
  • Prompt工程解析:从指令模型到推理模型的提示词设计
  • k8s基础概念和组件介绍
  • 【UniApp 日期选择器实现与样式优化实践】
  • 构建数据“高速路”绿算技术亮相数据要素联盟可信数据空间生态交流会,解锁可信数据空间新动能
  • 开启 DMARC 的作用对发件域名来说
  • 大模型解码基础知识笔记
  • 【electron】electron中为什么要废弃remote,原因以及解决方案——使用IPC通信
  • RAG工程落地:全链路观测和性能监控
  • Python 将文件夹中的所有文件打包成Zip压缩包