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

CMake 接入第三方库的三种方式:add_subdirectory、FetchContent 与 find_package(C++ 工程入门第六课)

本系列为《CMake 工程化进阶》完整 8 篇体系。
本篇目标:掌握 CMake 中接入第三方库的三种常见方式。

在真实 C++ 工程中,我们几乎不可能只写自己的代码。

常见情况包括:

  • 日志库(spdlog)
  • 格式化库(fmt)
  • JSON 解析(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(系统库)

这种方式适合:

已经安装到系统中的库。

例如:

  • OpenCV
  • Boost
  • Qt

示例

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

因为:

  • 源码可控
  • 构建稳定

六、完整示例 CMakeLists

cmake_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++ 服务项目骨架。

http://www.jsqmd.com/news/443556/

相关文章:

  • 变压器怎么选?聚焦能效、安全与场景适配的实战指南 - 深度智识库
  • 2026最新音乐艺考推荐!辽宁省统考/考研/校考优质音乐艺考机构权威榜单发布 - 十大品牌榜
  • 【Part 3 Unity VR眼镜端播放器开发与优化】第四节|高分辨率VR全景视频播放性能优化 - 指南
  • 2026年济南室内LED显示屏哪家好,高口碑供应商与品牌推荐 - 工业设备
  • 低空慧眼:2026军用2D成像无人机蜂群系统供应商深度解析 - 品牌2026
  • 盒马鲜生卡回收、使用全流程解析 - 团团收购物卡回收
  • 2026深度横评10款护颈枕:从人体工学到材质解码,帮你找回满分深睡体验! - 博客万
  • 279_尚硅谷_管道的注意事项和细节(1)
  • SSH 登录/退出实时监控脚本
  • 揭秘无人机通信链路两大攻击手段:姿态欺骗与电量伪造
  • 2026年投融资纠纷律师价格大揭秘,北京哪家收费合理? - 工业品网
  • 2026成都等地最新别墅装修品牌推荐:全场景覆盖,这家环保家装实力领跑 - 十大品牌榜
  • 2026成都等地最新房屋装修公司推荐:全场景适配,这家实力领跑 - 十大品牌榜
  • 长芯微LPA4112完全P2P替代ADA4522,是一款高精度双通道放大器,采用了自稳零和斩波技术
  • 2026年广州有机硅消泡剂厂家年度排名,哪家性价比高 - 工业品牌热点
  • 像素级清晰:2026战区地形三维成像无人机蜂群系统供应商洞察 - 品牌2026
  • 娱乐办公两不误,【虚拟屏】远程办公的隐私保护神器
  • 2026年牛饲料生产厂哪家技术强,为你揭秘靠谱品牌 - myqiye
  • 2026最新苏州婚纱摄影综合实力TOP10榜单正式发布 - charlieruizvin
  • 深度解析:如何在供应链黑盒中构建嵌入式系统的安全防线
  • ffplayer面试总结
  • 2026年变压器/箱式变电站/配电柜/电抗器/光伏一体机厂家推荐:陕西变压器全品类实力详解 - 深度智识库
  • 二次元影像测量仪什么牌子好
  • 2026年 太空舱厂家推荐排行榜:二手/民宿/景区/露营/酒店/户外/装配式/可移动/一体式/移动/预制/智能太空舱全方位解析 - 品牌企业推荐师(官方)
  • 帝国cms.5版的编辑器默认会清除多余的word代码,如果要保留word格式怎么修改?EmpireCMS
  • 盘点2026年上海口碑好的减震器冲击试验机生产厂家,解决选购难题 - 工业推荐榜
  • 光学动作捕捉技术:机器人科研领域的数据基石与NOKOV度量动捕的应用实践
  • 国内靠谱的https证书供应商有哪些?2026年https证书申请/https证书购买渠道推荐 - 麦麦唛
  • 阿里内部“SpringCloudAlibaba全彩版学习笔记”正式开源
  • 金三银四最全Java面试题:数据结构+算法+JVM+线程+finalize+GC