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

CMake中的“包管理“模块FetchContent

在这里插入图片描述

背景介绍

C++的包管理工具,好像除了微软家的vcpkg外,并没有一个特别有名的包管理器。
CMake其实也提供了基础的包管理功能。使用 FetchContent 模块系列命令可以下载项目依赖的源代码或者其他文件。

基本用法

FetchContent_Declare命令定义我们下载的内容,支持从URL、GIT、SVN、Mercurial 或 CVS获取,以常用的GIT和URL为例,基本用法如下:

cmake_minimum_required(VERSION 3.11)
include(FetchContent)FetchContent_Declare(googletest     # 大小写敏感的非空字符串,表示这个依赖项的名称,后续 find_package 中使用,建议使用项目的官方名称GIT_REPOSITORY https://github.com/google/googletest.gitGIT_TAG        b514bdc898e2951020cbdca1304b75f5950d1f59 # release-1.15.2
)
FetchContent_Declare(myCompanyIconsURL      https://intranet.mycompany.com/assets/iconset_1.12.tar.gzURL_HASH MD5=5588a7b18261c20068beabfb4f530b87
)FetchContent_MakeAvailable(googletest myCompanyIcons)find_package(googletest)
find_package(myCompanyIcons)

需要调用FetchContent_MakeAvailable 执行实际的下载任务,保证 FetchContent_Declare中定义的依赖库能被当前构建系统使用

FetchContent_MakeAvailable(<name1> [<name2>...])

这样在后续 CMake 脚本中就可以直接使用 find_package 命令引用这些依赖库。

进阶用法

FetchContent模块提供了几个有用的变量,FETCHCONTENT_BASE_DIRFETCHCONTENT_QUIETFETCHCONTENT_FULLY_DISCONNECTED

FETCHCONTENT_BASE_DIR
设置下载保存的目录,默认是${CMAKE_BINARY_DIR}/_deps,我们可以利用这个变量自定义下载保存的目录。

set(FETCHCONTENT_BASE_DIR ${CMAKE_BINARY_DIR}/third_party)

FETCHCONTENT_QUIET
设置下载过程中是否显示详细的日志,如果我们遇到下载失败的情况,可以把这个开关打开,方便排查问题。默认是关闭状态。

set(FETCHCONTENT_QUIET ON)

FETCHCONTENT_FULLY_DISCONNECTED
设置每次构建时是否重新下载依赖项目。赋值为ON时,它假设我们上一次构建时已经正确使用了依赖项,并且开发者知道这些依赖项的版本没有变化,后续构建时不需要重新下载。默认是每次构建都会重新下载,默认值是OFF。

set(FETCHCONTENT_FULLY_DISCONNECTED ON)

使用 FetchContent_Declare 时,默认依赖项目的 CMakeLists.txt 文件在其根目录下。如果并非如此,例如大名鼎鼎的 protobuf 项目,其CMakeLists.txt 在其根目录的cmake 目录下,我们可以使用SOURCE_SUBDIR参数指定 CMakeLists.txt 的路径,告诉·FetchContent_Declare·去哪里找它。

FetchContent_Declare(protobufGIT_REPOSITORY https://github.com/protocolbuffers/protobuf.gitGIT_TAG        1be1c9d0ea6efa2a25bd7b76186844d1669be78a # v29.4SOURCE_SUBDIR  cmake
)

参考资料

https://cmake.org/cmake/help/latest/module/ExternalProject.html
https://cmake.org/cmake/help/latest/module/FetchContent.html

相关文章:

  • 2025五一数学建模竞赛B题完整分析论文(共42页)(含模型、可运行代码、数据)
  • 【CV数据集】DIOR遥感目标检测数据集(含处理好的YOLO、COCO、VOC格式和相关配置文件下载链接)
  • 数字智慧方案5971丨智慧农业大数据平台解决方案(59页PPT)(文末有下载方式)
  • AM剪辑软件汉化版:简单易用,开启视频创作之旅
  • 实现Sentinel与Nacos的规则双向同步
  • 案例:自动化获取Web页面小说(没钱修什么仙)——selenium
  • C++之特殊类设计及类型转换
  • linux下安装ollama网不好怎么办?
  • 【分享】数据恢复大师6.10[特殊字符]恢复手机误删的数据[特殊字符]
  • 位运算题目:寻找重复数
  • Flutter PIP 插件 ---- 新增PipActivity,Android 11以下支持自动进入PIP Mode
  • Fellou:重新定义浏览器边界的智能行动平台
  • 【漫话机器学习系列】235.切分文本(Tokenize Text)
  • OSPF的路由
  • Python 数据智能实战 (6):用户评论深度挖掘
  • SpringTas定时任务使用详解
  • 动态规划简单题2
  • 博客打卡-人类基因序列功能问题动态规划
  • GESP2024年6月认证C++八级( 第二部分判断题(1-5))
  • 【现代深度学习技术】现代循环神经网络02:长短期记忆网络(LSTM)
  • 履新宿州市政府党组书记后,任东暗访五一假期安全生产工作
  • 魔都眼|买买买,老铺黄金新店开业被挤爆:有人排队5小时
  • 五一首日出沪高峰,G1503高东收费站上午车速约30公里/小时
  • 光明网评“泉州梦嘉商贸楼不到5年便成危楼”:监管是否尽职尽责?
  • 如何反击右翼思潮、弥合社会分裂:加拿大大选镜鉴
  • 当老年人加入“行为艺术基础班”