C++ 包管理工具概览 C++ 历史上缺乏像Cargo、npm 那样的事实标准包管理器,实践中常见专用包管理器 、CMake 内嵌方案 、系统包管理 与构建系统一体方案 并存;文中对vcpkg、Conan 与CMake 生态 着墨较多,亦覆盖 xmake、Meson、Bazel 等,便于对照选型。名称上Conan (JFrog 生态)常被口误写成 “canon”。下文按类别归纳主流工具、特点与选型思路,并附生态关系图 、与 CMake 集成方式 及选型决策示意 ;版本与命令以各项目官方文档 为准。
目录 生态中的位置(示意) 工具总览表 vcpkg、Conan 与 CMake 的常见协作 最小配置片段(示例) vcpkg(微软) Conan CPM.cmake Hunter FetchContent(CMake 内置) 系统包管理器 Bazel build2 Spack xmake Meson 选型决策树(示意) 其他与选型建议 延伸阅读 免责声明 生态中的位置(示意) 读图要点 :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 DSL 的xmake.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.jsonconan install 生成conan_toolchain.cmake /CMakeDeps 等,再在cmake时-DCMAKE_TOOLCHAIN_FILE=... 或CMake Presets 版本锁定 vcpkg.json中builtin-baseline 或overrides (随 vcpkg 版本演进)Conan 2 推荐lockfile +profile 二进制复用 binary caching (NuGet、文件共享等,见官方文档)同一 profile 下命中缓存则少编译 心智模型 「port + triplet」决定如何编库 「recipe + profile + package_id」决定 ABI 与包身份
最小配置片段(示例) vcpkg manifest(节选) :
{ "name" : "my-app" , "version" : "1.0.0" , "dependencies" : [ "fmt" , "zlib" ] } Conan 2conanfile.txt(节选,仅示意) :
[requires] zlib/1.3.1 [generators] CMakeDeps CMakeToolchain实际generator 名称与布局 以 Conan 2 文档为准;配置后仍需在CMakeLists.txt 中find_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.txt中include(CPM)后使用CPMAddPackage ,底层多为FetchContent 依赖 通常 CMake3.14+ ,通过 Git 等拉源码 构建 缓存 常见缓存目录如~/.cache/CMake/CPM,多项目可复用 优点 零独立包管理器进程 ,配置短,适合原型与小团队注意 偏源码构建;超大量依赖时无 Conan 级二进制治理
Hunter 项目 说明 机制 CMakeExternalProject_Add 等在配置/生成阶段 拉取并构建依赖 特点 预置大量库的「Hunter 化」配方,工具链哈希 锁定构建环境 优点 侵入 CMake 项目的方式成熟,版本可钉死 注意 初次或清理后configure 时间 可能很长;入门配置比重于 CPM
FetchContent(CMake 内置) 项目 说明 能力 FetchContent_Declare/Populate从 Git、URL 等拉取源码并add_subdirectory优点 无第三方包管理器,最轻 注意 无通用「依赖图求解」,版本与传递依赖需手写 或由 CPM/Hunter 代劳
系统包管理器 项目 说明 代表 Debian/Ubuntuapt ,RHEL/Fedoradnf/yum ,Archpacman ,macOSHomebrew 等 用途 安装g++、cmake、ninja 及libfoo-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 手册
选型决策树(示意) 其他与选型建议 其它名称 :cget (CMake 检索/安装);xmake / Meson 见上文专节;conan 拼写勿与 “canon” 混淆。
简明选型 :
诉求 倾向 Windows 为主、快速统一依赖 vcpkg 多平台二进制复现、企业私有制品 Conan 仅 CMake、最少工具 CPM.cmake 或FetchContent 重型遗留 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详解.md (find_package与target_link_libraries的配合思路)。
免责声明 工具特性与命令随版本变化;生产选型请阅读所用工具 (如 vcpkg、Conan、CMake、xmake、Meson 等)的官方文档及许可证要求。
主题:C++ 包管理、vcpkg、Conan、CPM、CMake、xmake、Meson、Bazel、Spack。