网站首页 > 精选文章 正文
背景介绍
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.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_DIR、FETCHCONTENT_QUIET 和
FETCHCONTENT_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
猜你喜欢
- 2025-05-08 如何使用 Python 操作 Git 代码?GitPython 入门介绍
- 2025-05-08 GIT提交记录和Revert commit过程分析
- 2025-05-08 实战百万文件monorepo仓库的优化(实战百万文件monorepo仓库的优化研究)
- 2025-05-08 如何在GitHub上大显身手?(github zen)
- 2025-05-08 k8s自动化运维四之数据备份(k8s备份deploy)
- 2025-05-08 轻松部署Gemma3-27B,L20服务器+最新版vLLM高效推理
- 2025-05-08 从 Element UI 源码的构建流程来看前端 UI 库设计
- 2025-05-08 在游戏中学习git操作(五)(github游戏)
- 2025-05-08 【git】 如何删除所有 tag(本地和远程)
- 2025-05-08 Git所有命令图解(git 常用命令行入门)
- 最近发表
- 标签列表
-
- 向日葵无法连接服务器 (32)
- git.exe (33)
- vscode更新 (34)
- dev c (33)
- git ignore命令 (32)
- gitlab提交代码步骤 (37)
- java update (36)
- vue debug (34)
- vue blur (32)
- vscode导入vue项目 (33)
- vue chart (32)
- vue cms (32)
- 大雅数据库 (34)
- 技术迭代 (37)
- 同一局域网 (33)
- github拒绝连接 (33)
- vscode php插件 (32)
- vue注释快捷键 (32)
- linux ssr (33)
- 微端服务器 (35)
- 导航猫 (32)
- 获取当前时间年月日 (33)
- stp软件 (33)
- http下载文件 (33)
- linux bt下载 (33)