C 和 C++ 第三方包管理
C/C++ 第三方库管理解决两件事:库从哪里来,以及构建系统怎么找到它。常见选择是 vcpkg、Conan、系统包管理器、源码子模块。
选择方式
| 方式 | 适合场景 | 特点 |
|---|---|---|
| vcpkg | CMake 项目、跨平台 C++ 应用 | 和 CMake 集成简单,包多 |
| Conan | 需要精细控制版本、配置、二进制包 | 更偏 C/C++ 包管理体系 |
| 系统包管理器 | Linux 服务、系统库 | 简单,但跨平台一致性弱 |
| 源码子模块 | 必须固定源码、库很小或需改源码 | 可控,但升级维护成本高 |
vcpkg + CMake 最小流程
安装库:
vcpkg install fmtmain.cpp:
#include <fmt/core.h>
int main()
{
fmt::print("Hello vcpkg + CMake\n");
return 0;
}CMakeLists.txt:
cmake_minimum_required(VERSION 3.20)
project(UseVcpkg LANGUAGES CXX)
find_package(fmt CONFIG REQUIRED)
add_executable(app main.cpp)
target_compile_features(app PRIVATE cxx_std_17)
target_link_libraries(app PRIVATE fmt::fmt)配置构建:
cmake -S . -B build -G Ninja -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build buildLinux/macOS:
cmake -S . -B build -G Ninja -DCMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake
cmake --build build使用清单模式时可添加 vcpkg.json:
{
"dependencies": [
"fmt"
]
}Conan + CMake 最小流程
conanfile.txt:
[requires]
fmt/10.2.1
[generators]
CMakeDeps
CMakeToolchain
[layout]
cmake_layout安装依赖:
conan install . --output-folder=build --build=missing -s build_type=ReleaseCMakeLists.txt:
cmake_minimum_required(VERSION 3.20)
project(UseConan LANGUAGES CXX)
find_package(fmt CONFIG REQUIRED)
add_executable(app main.cpp)
target_compile_features(app PRIVATE cxx_std_17)
target_link_libraries(app PRIVATE fmt::fmt)配置构建:
cmake -S . -B build -G Ninja -DCMAKE_TOOLCHAIN_FILE=build/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release
cmake --build build系统包管理器
Ubuntu 示例:
sudo apt install libfmt-dev
cmake -S . -B build
cmake --build buildmacOS 示例:
brew install fmt
cmake -S . -B build
cmake --build build优点是简单;缺点是版本受系统影响,CI 和开发机可能不一致。
源码子模块
适合小型库或需要固定源码的库:
git submodule add https://github.com/fmtlib/fmt.git third_party/fmt
git submodule update --init --recursiveCMake 接入:
add_subdirectory(third_party/fmt)
add_executable(app main.cpp)
target_link_libraries(app PRIVATE fmt::fmt)核心命令自查表
| 命令 | 作用 |
|---|---|
vcpkg install fmt | 安装 vcpkg 包 |
vcpkg list | 查看已安装包 |
conan install . --build=missing | 安装 Conan 依赖,缺二进制时构建 |
conan profile detect | 生成默认 Conan profile |
apt install libxxx-dev | Ubuntu 安装开发包 |
brew install xxx | macOS 安装包 |
git submodule update --init --recursive | 拉取子模块 |
常见错误
| 现象 | 原因 | 处理 |
|---|---|---|
find_package 找不到包 | CMake 没拿到 toolchain 或 prefix path | 检查 vcpkg/Conan 配置命令 |
| Debug/Release 混用 | 库和项目构建类型不一致 | 保持 CMAKE_BUILD_TYPE、Conan settings 一致 |
| Windows 链接失败 | 运行库、架构或 triplet 不一致 | 检查 x64/x86、static/dynamic triplet |
| CI 能过本地不过 | 依赖版本不一致 | 使用 lockfile、manifest 或固定版本 |
注意事项
- 包管理器不替代 CMake、Make、Bazel,它只解决依赖来源和接入。
- CMake 项目优先使用包导出的 target,例如
fmt::fmt。 - 不要把下载后的依赖产物直接提交到仓库,除非团队明确这样管理。