新闻中心
c++怎么在CMake中使用FetchContent来管理依赖_C++项目依赖管理与CMake技巧
FetchContent是CMake 3.14引入的模块,用于在构建时自动下载并集成第三方库。通过FetchContent_Declare声明依赖源(如Git仓库或ZIP包),再调用FetchContent_MakeAvailable触发下载与配置,使外部库成为项目的一部分,支持直接链接目标。相比ExternalProject_Add更简单直观,适合现代CMake工作流,推荐结合find_package优先查找系统库,未找到时回退到网络获取,提升构建效率与可移植性。

在现代C++项目中,依赖管理是一个关键环节。使用CMake的FetchContent模块可以让你在构建时自动下载并集成第三方库,无需手动管理子模块或外部构建流程。这种方式特别适合开源项目或团队协作开发,简化了构建环境的配置。
什么是FetchContent?
CMake 3.14引入了FetchContent模块,它允许你在CMake脚本中声明外部依赖,并在配置阶段自动获取(如从Git仓库、tar包等),然后像普通子目录一样将其包含进项目中。
相比传统的ExternalProject_Add,FetchContent更简单直观,所有内容都在本地构建树中,支持直接链接目标(target_link_libraries),更适合现代CMake工作流。
基本用法:添加一个第三方库
以引入nlohmann/json为例,展示如何使用FetchContent:
cmake_minimum_required(VERSION 3.14) project(MyApp) include(FetchContent) FetchContent_Declare( nlohmann_json GIT_REPOSITORY https://www.php.cn/link/b82e68e6366d4177332acdf3fa4d1e3a.git GIT_TAG v3.11.2 ) FetchContent_MakeAvailable(nlohmann_json)
上面代码做了三件事:
-
声明依赖源:通过
FetchContent_Declare指定Git地址和标签版本。 -
触发下载与配置:
FetchContent_MakeAvailable会下载内容并调用其CMakeLists.txt,使其成为项目的一部分。 -
可用性:之后就可以使用
nlohmann_json::nlohmann_json这样的目标进行链接。
接着在你的可执行文件中使用它:
Reachout.ai
一个AI驱动的视频开发平台,专为忙碌的企业家和销售团队打造
142
查看详情
add_executable(myapp main.cpp) target_link_libraries(myapp PRIVATE nlohmann_json::nlohmann_json)
支持多种获取方式
FetchContent_Declare支持多种来源:
-
Git仓库:使用
GIT_REPOSITORY和GIT_TAG(推荐使用确切tag)。 -
HTTP压缩包:
URL https://example.com/zipfile.zip。 -
本地路径:
SOURCE_DIR /path/to/local/dir,便于本地调试。
例如使用ZIP包:
FetchContent_Declare( fmt URL https://github.com/fmtlib/fmt/releases/download/10.0.0/fmt-10.0.0.zip ) FetchContent_MakeAvailable(fmt)
然后链接fmt::fmt即可。
优化体验的小技巧
- 避免重复下载:CMake会在构建目录中缓存已下载的内容,清理构建目录才会重新下载。
-
离线构建支持:可通过预设
SOURCE_DIR跳过网络请求,适合CI/CD或无网环境。 -
统一管理多个依赖:可将所有
FetchContent_Declare集中在一个dependencies.cmake文件中再include。 -
控制是否启用内部版本:结合
find_package()优先查找系统安装版本,找不到再用FetchContent回退:find_package(nlohmann_json 3.11.2 QUIET) if(NOT nlohmann_json_FOUND) FetchContent_Declare(...) FetchContent_MakeAvailable(nlohmann_json) endif()
基本上就这些。FetchContent让C++项目的依赖管理变得轻量又可靠,尤其适合中小型项目快速集成常用库。只要确保CMake版本够新,就能享受“开箱即用”的便捷体验。
以上就是c++++怎么在CMake中使用FetchContent来管理依赖_C++项目依赖管理与CMake技巧的详细内容,更多请关注其它相关文章!
# 译为
# seo蜘蛛爬行教学
# 香薰的营销推广
# LUM数据网站建设论文
# 去哪儿网seo营销
# discuz帖子更好seo
# 成都网站建设推进
# 丰台企业营销推广代写
# 广州网站建设的开发方案
# SEO教学楼速写
# 郑州网站免费建设
# 编译成
# 离线
# 是一个
# js
# 如何将
# 工作流
# 器中
# 第三方
# 并在
# red
# 系统安装
# c++
# ai
# app
# github
# json
# git
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
谷歌google账号注册详细步骤 谷歌账号注册官方教程
C#中解析不规范的HTML为XML 常见的坑与解决办法
机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等
虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作
使用Python高效删除Word宏并转换DOCM为DOCX格式
Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】
晋江读书网页版在线登录 晋江读书电脑版官网
邮政快递包裹最新位置 邮政快递实时追踪入口
192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台
苹果手机指南针不准怎么校准 传感器校准方法详解【建议收藏】
利用Bokeh CustomJS动态控制DataTable列可见性
Excel文件在线转换快速入口 Excel在线格式转换网站
蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接
4399体育竞技小游戏_4399小游戏赛事入口
J*aScript中正确使用querySelectorAll与复杂CSS选择器
Mac怎么查看崩溃日志_Mac控制台错误报告分析
Win10自动更新怎么关闭 Win10永久关闭系统更新的两种方法【终极版】
内存检查:在VS Code中调试C++时的内存视图
html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】
铃兰之剑为这和平的世界希里技能组及加点推荐
夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案
Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】
c++如何使用Meson构建系统_c++比CMake更快的构建工具
纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析
如何有效阻止外部脚本意外修改内联样式的高度属性
必由学官网首页入口 必由学教师网页版登录指南
Python中高效访问嵌套字典与列表中的键值对
lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法
Pandas DataFrame 高效批量赋值:告别循环与笛卡尔积误区
fishbowl官网免费版 fishbowl养鱼网站入口
Node.js CSV 数据处理:基于字段值条件过滤整条记录的策略
在J*aScript中复现SciPy的B样条拟合与求值:关键考量
4399免费游戏网址入口 4399小游戏免费入口点开即玩
漫蛙漫画官方首页 漫蛙2漫画在线阅读入口
Win11怎么开启卓越性能模式 Win11电源选项启用高性能释放硬件潜力【方法】
c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换
Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达
Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】
C++如何实现异步操作_C++11使用std::future和std::async进行异步编程
uc浏览器网页版极速入口 uc网页浏览器网页版流畅体验
处理动态列数据:J*a ArrayList的正确初始化与字符累加教程
解决深度学习模型训练初期异常高损失与完美验证准确率问题
网易大神账号申诉需要多久_网易大神账号申诉流程说明
漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端
现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践
126邮箱账号注册 电脑版登录入口
Shopware订单对象中获取产品自定义字段的正确方法
Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法
Go语言中JSON数据解析与字段访问教程
如何在CSS中使用浮动制作导航栏_float实现水平菜单


2025-11-14
浏览次数:次
返回列表
FetchContent_Declare(
fmt
URL https://github.com/fmtlib/fmt/releases/download/10.0.0/fmt-10.0.0.zip
)
FetchContent_MakeAvailable(fmt)