Conan 通过解耦依赖声明与构建逻辑实现 C++ 依赖管理:用 conanfile.py 声明依赖并配置选项,Conan 自动下载、编译、生成 CMake 工具链和依赖文件,CMake 零手动配置即可 find_package 和链接。

用 Conan 管理 C++ 项目依赖,核心是把“依赖声明”和“构建逻辑”解耦:你只管写 conanfile.py 或 conanfile.txt 声明要什么库,Conan 负责下载、编译(可选)、配置路径,再把头文件、库、链接参数自动注入到你的构建系统(如 CMake)中。
用 conanfile.py 声明依赖(推荐)
比 .txt 更灵活,支持 Python 逻辑、条件判断、版本范围、自定义构建选项。一个典型最小化示例:
from conan import ConanFile from conan.tools.cmake import CMakeToolchain, CMakeDeps, CMakeclass MyProject(ConanFile): settings = "os", "compiler", "build_type", "arch" generators = "CMakeDeps", "CMakeToolchain" # 自动为 CMake 生成 deps 和 toolchain 文件
def requirements(self): self.requires("fmt/10.2.1") self.requires("spdlog/1.13.0") self.requires("boost/1.84.0", transitive_headers=True) def configure(self): self.options["boost"].shared = False # 控制子依赖的选项注意:
transitive_headers=True表示让 boost 的头文件也对当前项目可见;shared=False是常见优化(静态链接减少部署负担)。立即学习“C++免费学习笔记(深入)”;
集成 CMake(零手动路径处理)
不用
find_package()手动找,也不用硬编码include_directories()。在CMakeLists.txt中只需:cmake_minimum_required(VERSION 3.23) project(MyApp)Conan 生成的 toolchain 和 deps 会自动设置编译器、标准、路径等
set(CMAKE_TOOLCHAIN_FILE $ENV{CONAN_TOOLCHAIN_FILE} CACHE STRING "") include($CMAKE_TOOLCHAIN_FILE)
find_package(fmt REQUIRED) find_package(spdlog REQUIRED) find_package(Boost REQUIRED)
add_executable(app main.cpp) target_link_libraries(app PRIVATE fmt::fmt spdlog::spdlog Boost::boost)
关键点:
- 运行conan install . --build=missing -s build_type=Release后,Conan 会生成conan_toolchain.cmake和xxx-deps.cmake;
- 它们会被 CMake 自动加载,所有 include、lib、defines、compile options 全部就位;
-find_package(xxx)能成功,是因为 Conan 提供了兼容的 Config 模块(通过CMakeDeps生成)。本地开发与团队协作统一流程
避免“在我机器上能跑”的问题,靠三件事固化流程:
-
锁定依赖版本:用
conan lock create生成conan.lock,记录精确版本+hash+配置,CI 和同事都用它复现环境; -
私有仓库支持:公司内部库推到 Artifactory 或 Nexus,
conan remote add my-company https://artifactory.example.com/v1,再conan upload即可; -
构建隔离:每个配置(如 Windows/MSVC/Release)单独建
build/目录,conan install也进对应目录,不污染源码树。
常见坑与应对
red">不是所有包都开箱即用——尤其老项目或自研库。这时你需要:
- 用
conan new hello/0.1 --template=cmake_lib快速生成带测试、打包逻辑的模板; - 若依赖没上 conan-center,可
conan export-pkg本地打包,或写conanfile.py+source()/build()/package()方法从源码构建; - 跨平台编译出错?检查
settings.compiler.libcxx(如libstdc++11vslibc++)是否和你的 STL 一致; - 链接失败提示 “undefined reference”?确认
target_link_libraries用了正确的 target 名(查xxx-config.cmake里定义的 alias,通常是pkg::target)。
基本上就这些。Conan 不是银弹,但它把 C++ 依赖管理从“手工拼凑”推进到了“声明即交付”的工程化阶段。关键是坚持声明式写法、锁文件驱动、CMake 零侵入集成——不复杂但容易忽略。











