CMake中的“包管理“模块FetchContent

背景介绍

C++的包管理工具,好像除了微软家的vcpkg外,并没有一个特别有名的包管理器。

CMake其实也提供了基础的包管理功能。使用 FetchContent 模块系列命令可以下载项目依赖的源代码或者其他文件。

基本用法

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

cmake 复制代码
cmake_minimum_required(VERSION 3.11)
include(FetchContent)

FetchContent_Declare(
  googletest     # 大小写敏感的非空字符串,表示这个依赖项的名称,后续 find_package 中使用,建议使用项目的官方名称
  GIT_REPOSITORY https://github.com/google/googletest.git
  GIT_TAG        b514bdc898e2951020cbdca1304b75f5950d1f59 # release-1.15.2
)
FetchContent_Declare(
  myCompanyIcons
  URL      https://intranet.mycompany.com/assets/iconset_1.12.tar.gz
  URL_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(
  protobuf
  GIT_REPOSITORY https://github.com/protocolbuffers/protobuf.git
  GIT_TAG        1be1c9d0ea6efa2a25bd7b76186844d1669be78a # v29.4
  SOURCE_SUBDIR  cmake
)

参考资料

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

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

相关推荐
罗义凯26 分钟前
其中包含了三种排序算法的注释版本(冒泡排序、选择排序、插入排序),但当前只实现了数组的输入和输出功能。
数据结构·c++·算法
春蕾夏荷_7282977251 小时前
c++ easylogging 使用示例
c++·log·easylogging
syt_biancheng1 小时前
Day3算法训练(简写单词,dd爱框框,3-除2!)
开发语言·c++·算法·贪心算法
自然数e2 小时前
C++多线程【线程管控】之线程转移以及线程数量和ID
开发语言·c++·算法·多线程
Elias不吃糖4 小时前
epoll 事件全集、每个事件的含义、哪些事件在实际服务器中最常见、哪些会组合出现
linux·c++·event
AA陈超4 小时前
ASC学习笔记0017:返回此能力系统组件的所有属性列表
c++·笔记·学习·ue5·虚幻引擎
Unlyrical5 小时前
splice, io_uring_prep_splice 调用(无效参数)
linux·服务器·c++·unix
Lucis__6 小时前
STL设计模式探秘:容器适配器&仿函数
c++·容器·stl·仿函数
无敌最俊朗@6 小时前
C++ 对象布局之padding(填充字节)
开发语言·c++
小龙报6 小时前
《DevC++支持C++11等与其软件分辨率低的解决办法》
c语言·c++·windows·蓝桥杯·pat考试·学习方法·dvc++