C 和 C++ 第三方包管理

C/C++ 第三方库管理解决两件事:库从哪里来,以及构建系统怎么找到它。常见选择是 vcpkg、Conan、系统包管理器、源码子模块。

选择方式

方式适合场景特点
vcpkgCMake 项目、跨平台 C++ 应用和 CMake 集成简单,包多
Conan需要精细控制版本、配置、二进制包更偏 C/C++ 包管理体系
系统包管理器Linux 服务、系统库简单,但跨平台一致性弱
源码子模块必须固定源码、库很小或需改源码可控,但升级维护成本高

vcpkg + CMake 最小流程

安装库:

vcpkg install fmt

main.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 build

Linux/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=Release

CMakeLists.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 build

macOS 示例:

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 --recursive

CMake 接入:

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-devUbuntu 安装开发包
brew install xxxmacOS 安装包
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
  • 不要把下载后的依赖产物直接提交到仓库,除非团队明确这样管理。