当前位置: 首页 > 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) 找到你做的库!


http://www.lqws.cn/news/535465.html

相关文章:

  • 【缓存技术】深入分析如果使用好缓存及注意事项
  • Flux.create
  • Linux 内核 TCP 的核心引擎:tcp_input.c 与 tcp_output.c 的协同之道
  • ubuntu安装docker遇到权限问题
  • TCP 重传机制详解:原理、变体与故障排查应用
  • 利用python和libredwg库解析dwg格式文件输出GeoJSON
  • Mac电脑如何搭建基于java后端的开发的各种工具服务
  • 自动获取文件的内存大小怎么设置?批量获取文件名和内存大小到Excel中的方法
  • IDEA下载不了插件了怎么办?从本地导入插件详细教程!
  • ubuntu 远程桌面 xrdp + frp
  • 【工具推荐】WaybackLister——发现潜在目录列表
  • OpenBayes 一周速览丨Nanonets-OCR-s深度语义理解,精准结构化转换;HLE人类问题推理基准上线,含2.5k题目,助力封闭式评估体系构建
  • 环境太多?不好管理怎么办?TakMll 工具帮你快速切换和管理多语言、多版本情况下的版本切换。
  • 基于SpringBoot和Leaflet的区域冲突可视化-以伊以冲突为例
  • 【Pytorch】语言模型上的动态量化
  • 供应链管理:主要生产计划类型及其相关信息
  • Solidity学习 - 认识Solidity合约结构
  • GitLab 18.1 发布 Runner、无效的个人访问令牌查看等功能,可升级体验!
  • 一分钟了解Transformer
  • 深入了解 AWS EventBridge
  • 无人机螺旋桨机械能模块解析
  • 深入解析前端 Meta 标签:HTML 的隐形守护者与功能大师
  • cudaStreamCreateWithPriority和cudaDeviceGetStreamPriorityRange
  • 基于vue框架的二手图书零售系统q7jqy(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 279. 完全平方数
  • 2025 Java开发生态全景图:云原生、AI与性能优化的技术融合
  • 用 Spark 优化亿级用户画像计算:Delta Lake 增量更新策略详解
  • flutter结合ai工具(其他语言通用)
  • 【CMake基础入门教程】第六课:构建静态库 / 动态库 与安装规则(install)
  • Linux命令:内置命令与外部命令的本质区别