TL;DR 简要回答:
因为 C++ 标准委员会(ISO C++)只制定语言和标准库本身,而不管理生态和工具链。再加上历史包袱、生态碎片、平台多样性等因素,导致 C++ 没有统一的官方包管理器。
一、标准委员会的职责决定了它“不管这事”
ISO C++ 的目标是定义:
语法(如模板、范围 for)
标准库(如 STL、线程、正则)
ABI、行为规范(如未定义行为)
但它不负责:
编译器实现(GCC、Clang、MSVC)
构建系统(Make、CMake、Meson)
包管理器(vcpkg、conan、hunter)
标准委员会不干涉工具生态,这是它一贯的方针。
—— Herb Sutter(C++ 核心专家)
二、历史包袱:C++ 太早出现了
C++ 诞生于 1980 年代,那时网络尚不普及、没有中央仓库概念。
开发者习惯于:
手动下载源码
写 Makefile 编译
把 .h、.cpp 拷贝进项目
C++ 是一个在 包管理之前就广泛使用 的语言。
它的历史比 npm、pip、cargo、go mod 等都早。
三、生态高度碎片化
C++ 在 平台、编译器、构建系统、ABI 等方面都不统一,导致包管理器实现困难:
方面 状况
编译器 GCC, Clang, MSVC 等 ABI 不兼容
构建系统 CMake, Make, MSBuild, Autotools 各自为政
平台 Windows、Linux、macOS 差异大
包形式 有的只提供源码、有的预编译、有的静态、有的动态
一个包可能在 Windows 用 vcpkg,Linux 用 apt,Mac 用 brew,在构建时还得兼容不同编译器。
四、社区内缺乏统一意志
vcpkg(微软)、conan(JFrog)、hunter、Buckaroo、spack、biicode 等工具争相竞争,但没有一个成为真正的共识性标准。
这导致开发者和厂商各用各的,你的包我装不了、我的 ABI 你编译不了。
CMake 虽然几乎成了构建的事实标准,但它本身不是包管理器。
五、标准化包管理器的现实障碍
若委员会标准化一个包管理器,还要考虑:
安全性(依赖信任)
后向兼容(老包支持)
实现维护(谁维护仓库和服务?)
法律合规(哪些国家能访问?)
这相当于做一个“开源界的 C++ App Store”,很难落地。
六、未来方向?
虽然 ISO C++ 不直接管包管理器,但**正在推动模块化(C++20 Modules)**来间接帮助生态改进:
模块有助于加快编译、清晰依赖
模块可与包管理器(如 vcpkg)结合得更紧密
将来可能形成基于模块的生态系统,但还在缓慢推进
【 在 quicker 的大作中提到: 】
: C++依然是大内高手们智力和高水平的标志,即便是21世纪过去1/4了,他们还是没有给C++造出一个统一好用的包管理工具
--
FROM 114.245.255.*