CMake 接入第三方库的三种方式:add_subdirectory、FetchContent 与 find_package(C++ 工程入门第六课) 📅 发布时间:2026/7/13 0:02:05 👁️ 浏览次数: 本系列为《CMake 工程化进阶》完整 8 篇体系。本篇目标掌握 CMake 中接入第三方库的三种常见方式。在真实 C 工程中我们几乎不可能只写自己的代码。常见情况包括日志库spdlog格式化库fmtJSON 解析nlohmann/json网络库boost / asio问题来了如何把这些库接入到 CMake 工程CMake 提供了三种主流方式方式使用场景add_subdirectory项目内嵌源码FetchContent自动下载依赖find_package使用系统安装库这一课我们逐一讲清。一、方式一add_subdirectory源码方式这种方式最简单。适合第三方库源码直接放在项目中。示例工程结构MyApp/ app/ main.cpp util/ util.cpp util.h third_party/ fmt/ CMakeLists.txt引入第三方库add_subdirectory(third_party/fmt)这会编译 fmt生成 target链接库target_link_libraries(app fmt::fmt)现在 app 就可以使用 fmt。使用 fmt#include fmt/core.h int main() { fmt::print(Hello {}\n, CMake); }二、方式二FetchContent现代主流现代 CMake 更推荐这种方式。优点自动下载自动编译不需要手动管理源码引入模块include(FetchContent)下载库FetchContent_Declare( fmt GIT_REPOSITORY https://github.com/fmtlib/fmt.git GIT_TAG 10.1.1 )自动构建FetchContent_MakeAvailable(fmt)链接库target_link_libraries(app fmt::fmt)优点FetchContent 解决了很多问题不需要手动下载源码CMake 自动管理依赖适合开源项目三、方式三find_package系统库这种方式适合已经安装到系统中的库。例如OpenCVBoostQt示例find_package(OpenCV REQUIRED)链接库target_link_libraries(app ${OpenCV_LIBS})示例代码#include opencv2/opencv.hpp int main() { cv::Mat image; }四、三种方式对比方式优点缺点add_subdirectory简单直接需要手动管理源码FetchContent自动下载依赖网络find_package使用系统库依赖系统环境五、现代 C 项目的推荐方式如果是开源项目推荐FetchContent原因自动化可复现依赖清晰如果是公司内部项目推荐add_subdirectory因为源码可控构建稳定六、完整示例 CMakeListscmake_minimum_required(VERSION 3.15) project(MyApp) set(CMAKE_CXX_STANDARD 17) include(FetchContent) FetchContent_Declare( fmt GIT_REPOSITORY https://github.com/fmtlib/fmt.git GIT_TAG 10.1.1 ) FetchContent_MakeAvailable(fmt) add_executable(app app/main.cpp ) target_link_libraries(app fmt::fmt)七、本课总结本课解决了真实工程中最重要的问题之一如何接入第三方库。掌握三种方式方法使用场景add_subdirectory本地源码FetchContent自动下载find_package系统安装库其中FetchContent 是现代 CMake 最常见方案。下一课预告下一篇将进入Linux 服务项目的工程结构设计我们会把当前工程升级为cmd/internal/lib/third_party/并搭建一个真正可扩展的 C 服务项目骨架。
JS遍历对象 加粗样式 方法 返回值 通俗解释 Object.values(对象) 一个数组,包含对象中所有属性的值 只拿 “值”,不要 “键名” Object.entries(对象) 一个二维数组,每个子数组是 [键名, 值] 既拿 “键名”,也拿 “值” 示例: 1.从接口返回的多设备温湿度数据中,提取所有唯一且排序… 2026/7/11 12:08:35
计算机毕业设计springboot学生活动管理系统 基于SpringBoot框架的高校第二课堂活动管理平台 SpringBoot驱动的校园课外活动数字化管理系统 计算机毕业设计springboot学生活动管理系统za50t (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着移动互联网技术的快速发展,越来越多的用户借助智能手机和电脑完… 2026/7/10 7:25:15
2026 年想转行网络安全?一篇带你了解真实的网安职场! 在当前就业形势下,不少朋友咨询过龙哥,询问转行能否转行网络安全。网络安全作为一个热门领域,自然也吸引了许多人的目光。本文将就转行网络安全这一话题,提供一些切实可行的建议。 网络安全行业概况 网络安全涵盖了从基础的脚本编… 2026/7/11 6:06:58
HS2-HF Patch终极指南:如何用3步解决Honey Select 2的70+个痛点 HS2-HF Patch终极指南:如何用3步解决Honey Select 2的70个痛点 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 你是否曾经在Honey Select 2中遇到过… 2026/7/13 0:01:19
AI推荐结果怎么优化:适合深圳少儿素质培训机构的GEO服务商哪家好?全程零代码SAAS操作 这两年,越来越多深圳地区的少儿素质培训机构开始关注 GEO。 原因很简单。过去家长找培训机构、找兴趣班、找素质教育课程,主要靠搜索引擎、短视频平台、社交平台种草和熟人推荐;现在越来越多深圳本地家长,已经开始直接在 AI 里提… 2026/7/12 23:59:18
linux笔记归纳8:库制作与原理 库制作与原理 目录 库制作与原理 一、库的概念 二、静态库(.a) 2.1.静态库的本质 2.2.静态库的生成 2.3.静态库的使用 三、动态库(.so) 3.1.动态库的生成 3.2.动态库的使用 四、目标文件(.o) 五… 2026/7/12 23:57:18
3分钟零代码AI入门:Teachable Machine完整指南 3分钟零代码AI入门:Teachable Machine完整指南 【免费下载链接】teachablemachine-community Example code snippets and machine learning code for Teachable Machine 项目地址: https://gitcode.com/gh_mirrors/te/teachablemachine-community 你是否曾经… 2026/7/12 23:57:18
JSP传值问题解析与解决技巧 .()详解.()怎么用的?JSP1代码JSP2代码test().("test");为什么JS P2中会找不到test?它是被用于在同一个周期之内, 去保存变量以供使用的。比如说, 当进行调用后,便退出JSP页面, 这构成了一个周期, 要是在这个Jsp页面当中存在一些所需的处理结构, 那就从特… 2026/7/12 23:55:17
Bonsai社区与支持:如何获取帮助并参与讨论 Bonsai社区与支持:如何获取帮助并参与讨论 【免费下载链接】bonsai Understand the tree of dependencies inside your webpack bundles, and trim away the excess. 项目地址: https://gitcode.com/gh_mirrors/bon/bonsai Bonsai是一款帮助开发者理解webpac… 2026/7/12 23:55:17
HS2-HF Patch终极指南:如何用3步解决Honey Select 2的70+个痛点 HS2-HF Patch终极指南:如何用3步解决Honey Select 2的70个痛点 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 你是否曾经在Honey Select 2中遇到过… 2026/7/13 0:01:19
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14