C++ 包管理工具概览

C++ 包管理工具概览

C++ 历史上缺乏像 Cargo、npm 那样的事实标准包管理器,实践中常见 专用包管理器CMake 内嵌方案系统包管理构建系统一体方案 并存;文中对 vcpkg、ConanCMake 生态 着墨较多,亦覆盖 xmake、Meson、Bazel 等,便于对照选型。名称上 Conan (JFrog 生态)常被口误写成 "canon"。下文按类别归纳主流工具、特点与选型思路,并附生态关系图与 CMake 集成方式选型决策示意 ;版本与命令以各项目官方文档为准。


目录

  1. 生态中的位置(示意)
  2. 工具总览表
  3. [vcpkg、Conan 与 CMake 的常见协作](#vcpkg、Conan 与 CMake 的常见协作)
  4. 最小配置片段(示例)
  5. vcpkg(微软)
  6. Conan
  7. CPM.cmake
  8. Hunter
  9. [FetchContent(CMake 内置)](#FetchContent(CMake 内置))
  10. 系统包管理器
  11. Bazel
  12. build2
  13. Spack
  14. xmake
  15. Meson
  16. 选型决策树(示意)
  17. 其他与选型建议
  18. 延伸阅读
  19. 免责声明

生态中的位置(示意)

CMake 侧拉依赖
依赖来源(多选一或组合)
你的工程
提供编译器与系统 -dev
源码
CMakeLists.txt
vcpkg ports
Conan 包 / ConanCenter
apt / brew / dnf
FetchContent / CPM
Hunter

读图要点vcpkg / Conan 多在配置 CMake 之前或之中 把库装到约定前缀或通过 toolchain/generator 注入;CPM/FetchContent 则在 CMake 配置阶段拉源码进构建树。


工具总览表

工具 类型 核心特点 典型场景
vcpkg 专用 C++ 包管理 微软开源,多为主源码构建 ,与 CMake / MSBuild 集成深,支持 manifest(vcpkg.json)、二进制缓存 Windows/Linux/macOS,希望统一拉依赖的 C++ 项目
Conan 专用 C++ 包管理 去中心化二进制包强依赖解析,Conan 2 改进图模型与锁文件,可搭私有仓 多平台、多编译器、多配置,企业级与 CI 友好
CPM.cmake CMake 脚本 基于 FetchContent ,单文件引入,CPMAddPackage 声明依赖 中小型 CMake 项目,尽量少装额外 CLI
Hunter CMake 脚本 ExternalProject_Add 驱动,预配置包多,工具链哈希锁版本 已有较重 CMake 工程,希望依赖下载构建自动化
FetchContent CMake 内置 3.11+ 拉取源码加入工程,无高级版本/冲突解析 少量依赖(如测试框架)
apt/yum/brew... 系统级 装编译器、CMake、系统 -dev 包;库版本常偏旧 基线环境,或与 vcpkg/Conan 互补
Bazel 构建 + 依赖 大规模 monorepo、增量与远程缓存、多语言 类 Google 风格超大仓
build2 构建 + 包管理 类 Cargo 的一体化体验,生态相对小 愿意采用整套工具链的团队
Spack 领域包管理 HPC/科学计算,多版本、多编译器共存 超算、科研软件栈
xmake 构建 + 包管理 Lua DSLxmake.lua,内置 xmake-repo,一条工具链覆盖依赖与编译 希望少写 CMake、跨平台原型与中小项目
Meson 构建系统 meson.build + Ninja 后端,wrap / subproject 拉依赖 追求可读配置与较快配置阶段,与 CMake 项目并存时需分工

vcpkg、Conan 与 CMake 的常见协作

方式 vcpkg Conan
典型集成 CMAKE_TOOLCHAIN_FILE 指向 scripts/buildsystems/vcpkg.cmake ;或使用 manifest 模式在工程根放 vcpkg.json conan install 生成 conan_toolchain.cmake / CMakeDeps 等,再在 cmake-DCMAKE_TOOLCHAIN_FILE=...CMake Presets
版本锁定 vcpkg.jsonbuiltin-baselineoverrides(随 vcpkg 版本演进) Conan 2 推荐 lockfile + profile
二进制复用 binary caching(NuGet、文件共享等,见官方文档) 同一 profile 下命中缓存则少编译
心智模型 「port + triplet」决定如何编库 「recipe + profile + package_id」决定 ABI 与包身份

最小配置片段(示例)

vcpkg manifest(节选)

json 复制代码
{
  "name": "my-app",
  "version": "1.0.0",
  "dependencies": ["fmt", "zlib"]
}

Conan 2 conanfile.txt(节选,仅示意)

ini 复制代码
[requires]
zlib/1.3.1

[generators]
CMakeDeps
CMakeToolchain

实际 generator 名称与布局 以 Conan 2 文档为准;配置后仍需在 CMakeLists.txtfind_package 并与 目标链接(与手写路径相比更易维护)。


vcpkg(微软)

项目 说明
定位 开源 C++ 库管理器,以从 port recipe 构建为主,支持 Windows / Linux / macOS
集成 CMake toolchain 文件 、Visual Studio、vcpkg.json 清单模式,便于团队与 CI 复现
生态 官方维护大量 port(量级随时间增长),常见库如 Boost、OpenCV 等
缓存 支持二进制缓存(本地/远程),减轻重复编译
优点 上手路径清晰,与 MSVC/VS 体验好,清单模式易纳入版本控制
注意 首次全量构建耗时;个别 port 版本相对上游发布可能有滞后

Conan

项目 说明
定位 C/C++ 包管理器(Python 生态安装 CLI),强调按 profile (OS、编译器、ABI、构建类型)管理二进制制品
仓库 ConanCenter自建私有库(如与 Artifactory 集成)
Conan 2.x 依赖图、锁文件、元数据模型重构,长期推荐新项采用 2.x
优点 多配置/多平台下复用二进制,大企业内网分发友好,依赖解析能力强
注意 概念多于 vcpkg(profile、recipe、generators),学习曲线更陡

CPM.cmake

项目 建议 CMake
机制 CMakeLists.txtinclude(CPM) 后使用 CPMAddPackage ,底层多为 FetchContent
依赖 通常 CMake 3.14+ ,通过 Git 等拉源码构建
缓存 常见缓存目录如 ~/.cache/CMake/CPM,多项目可复用
优点 零独立包管理器进程,配置短,适合原型与小团队
注意 偏源码构建;超大量依赖时无 Conan 级二进制治理

Hunter

项目 说明
机制 CMake ExternalProject_Add 等在配置/生成阶段拉取并构建依赖
特点 预置大量库的「Hunter 化」配方,工具链哈希锁定构建环境
优点 侵入 CMake 项目的方式成熟,版本可钉死
注意 初次或清理后 configure 时间可能很长;入门配置比重于 CPM

FetchContent(CMake 内置)

项目 说明
能力 FetchContent_Declare / Populate 从 Git、URL 等拉取源码并 add_subdirectory
优点 无第三方包管理器,最轻
注意 无通用「依赖图求解」,版本与传递依赖需手写或由 CPM/Hunter 代劳

系统包管理器

项目 说明
代表 Debian/Ubuntu apt ,RHEL/Fedora dnf/yum ,Arch pacman ,macOS Homebrew
用途 安装 g++、cmake、ninjalibfoo-dev系统库
优点 与 OS 集成、签名与策略成熟
注意 库版本偏发行版节奏 ,跨机器复现常与容器或 vcpkg/Conan 混用

Bazel

项目 说明
定位 Google 开源构建与依赖系统,Starlark 规则,强 hermetic 与远程缓存
优点 超大仓增量构建、多语言(C++/Java/Go 等)统一
注意 对中小型纯 C++ 项目往往过重,与 CMake 生态直连用第三方转换或桥接

build2

项目 说明
定位 build2 工具链 + 内置包管理,理念接近 Cargo 式一体体验
优点 概念一致、依赖与构建统一
注意 社区与第三方库覆盖小于 vcpkg/Conan

Spack

项目 说明
定位 面向 HPC 与科学计算,同一库多版本 、多编译器、spec 组合
优点 复杂软件栈与超算环境友好
注意 通用业务 C++ 服务端日常开发较少作为首选

xmake

项目 说明
定位 构建系统 + 包管理 一体:xmake.lua 描述目标与选项,add_requires 等声明依赖,仓库 xmake-repo 维护大量包配方
与 CMake 关系 并行生态 :同一组织可「新模块用 xmake、老模块 CMake」并存,但跨工程复用需约定产物(静态/动态库、头路径)或统一一种主构建
优点 配置短、中文文档与社区活跃;交叉编译、工具链探测对新手较友好
注意 企业内若已深度绑定 CMake + Conan/vcpkg ,引入 xmake 需评估 CI、IDE、代码审查 习惯;版本与包 API 以 xmake 官方文档为准

Meson

项目 说明
定位 声明式构建meson.build 生成 Ninja (等)后端;依赖常通过 wrap (WrapDB / 本地 wrap 文件)或 subproject() 引入子工程
与 CMake 关系 常见于 GNOME/系统组件 与部分 C 库;与纯 CMake 工程无官方「互转」 ,协作方式多为 各编各的 再链接,或用 cmake subproject 等桥接(视场景)
优点 语法可读性强;配置阶段通常比「巨型 CMake」轻快;与 pkg-config 集成成熟
注意 第三方 C++ 库示例仍以 CMake 为主 时,需在 Meson 侧手写 dependency() / 自定义 *.pc 等;细节见 Meson 手册

选型决策树(示意)







新 C++ 项目选依赖方案
必须企业内网二进制分发?
是否坚持零额外 CLI、仅 CMake?
是否以 MSVC/Windows 为主?
优先考虑 Conan + 私有仓
CPM.cmake / FetchContent
vcpkg
vcpkg 或 Conan 均可,看团队习惯


其他与选型建议

其它名称cget (CMake 检索/安装);xmake / Meson 见上文专节;conan 拼写勿与 "canon" 混淆。

简明选型

诉求 倾向
Windows 为主、快速统一依赖 vcpkg
多平台二进制复现、企业私有制品 Conan
仅 CMake、最少工具 CPM.cmakeFetchContent
重型遗留 CMake、自动化 ExternalProject 评估 Hunter
基线编译器与系统库 apt/dnf/brew
超大 monorepo、多语言 Bazel
HPC/多版本科学栈 Spack
偏好 Lua 式单仓、内置包仓库 xmake
强声明式 + Ninja、与 GLib 等栈一致 Meson

延伸阅读

同仓库 CMake 与现代 C++ 构建相关文档可对照阅读,例如 hnjzsdx_doc/C++/CMake_target_include_directories_compile_definitions_link_libraries详解.mdfind_packagetarget_link_libraries 的配合思路)。


免责声明

工具特性与命令随版本变化;生产选型请阅读所用工具(如 vcpkg、Conan、CMake、xmake、Meson 等)的官方文档及许可证要求。


主题:C++ 包管理、vcpkg、Conan、CPM、CMake、xmake、Meson、Bazel、Spack。

相关推荐
努力努力再努力wz2 小时前
【C++高阶系列】告别内查找局限:基于磁盘 I/O 视角的 B 树深度剖析与 C++ 泛型实现!(附B树实现源码)
java·linux·开发语言·数据结构·c++·b树·算法
承渊政道2 小时前
【优选算法】(实战攻坚BFS之FloodFill、最短路径问题、多源BFS以及解决拓扑排序)
数据结构·c++·笔记·学习·算法·leetcode·宽度优先
王家视频教程图书馆2 小时前
rust 写gui 程序 最流行的是哪个
开发语言·后端·rust
Wadli2 小时前
Oncall Agent项目
开发语言
艾莉丝努力练剑2 小时前
【QT】Qt常用控件与布局管理深度解析:从原理到实践的架构思考
linux·运维·服务器·开发语言·网络·qt·架构
杜子不疼.2 小时前
用 Python 实现 RAG:从文档加载到语义检索全流程
开发语言·人工智能·python
chao1898442 小时前
基于改进二进制粒子群算法的含需求响应机组组合问题MATLAB实现
开发语言·算法·matlab
lcj25112 小时前
字符函数,字符串函数,内存函数
c语言·开发语言·c++·windows
独特的螺狮粉2 小时前
古诗词飞花令随机出题小助手:鸿蒙Flutter框架 实现的古诗词游戏应用
开发语言·flutter·游戏·华为·架构·开源·harmonyos