Conan 是 C++ 跨平台包管理器,通过 conanfile 声明依赖、conan install 下载/构建/生成配置,并集成到 CMake 流程中实现自动化依赖管理。

Conan 是 C++ 领域主流的跨平台包管理器,它不依赖构建系统(CMake/Make/Ninja 等),但能和它们无缝协作。核心思路是:把第三方库(如 fmt、Boost、OpenSSL)打包成可复用、可版本化、可配置的二进制“包”,再通过 conanfile.py 或 conanfile.txt 声明依赖,由 Conan 自动下载、构建(必要时)、安装并注入到你的构建流程中。
初始化项目并声明依赖
在项目根目录创建 conanfile.txt(适合简单项目)或 conanfile.py(推荐,更灵活):
- conanfile.txt 示例:
[requires] fmt/10.2.1 zlib/1.3.1[generators] CMakeDeps CMakeToolchain
- conanfile.py 示例(功能更强):
from conan import ConanFile from conan.tools.cmake import CMakeDeps, CMakeToolchainclass MyApp(ConanFile): settings = "os", "arch", "compiler", "build_type" requires = "fmt/10.2.1", "zlib/1.3.1"
def generate(self): tc = CMakeToolchain(self) tc.generate() deps = CMakeDeps(self) deps.generate()运行
conan install . --build=missing即可拉取依赖并生成 CMake 所需的配置文件(conan_toolchain.cmake、fmt-release-x86_64-data.cmake等)。集成到 CMake 构建流程
修改你的
CMakeLists.txt,让 CMake 加载 Conan 生成的配置:立即学习“C++免费学习笔记(深入)”;
- 在
project()之前加入:cmake_minimum_required(VERSION 3.23)(推荐 3.23+,兼容 Conan 2.x 的 generator) - 在
project()之后添加:include(${CMAKE_BINARY_DIR}/conan_toolchain.cmake) - 用
find_package(fmt CONFIG REQUIRED)查找依赖,再target_link_libraries(myapp PRIVATE fmt::fmt)
这样 CMake 就能自动找到头文件路径、链接库、编译定义等,无需手动写 include_directories() 或硬编码路径。
使用远程仓库与私有包
Conan 默认从 ConanCenter(官方免费仓库)拉取包。你也可以添加其他远程源:
- 查看当前远程:
conan remote list - 添加自建 Artifactory 或 Nexus:
conan remote add my-remote https://my-server.com/v1 - 上传自己的包:
conan create . --name=mylib --version=1.0(先本地测试),再conan upload mylib/1.0 -r=my-remote --force
私有项目建议配置 conan remote add --force conancenter https://center.conan.io 显式启用官方源,并用 conan profile 管理不同环境(如 Windows MSVC / Linux GCC)的设置。
常见问题快速应对
-
找不到包? 检查拼写和版本号,访问 conan.io/center 确认是否存在;也可用
conan search "fmt*" -r conancenter搜索 -
编译失败? 多数因编译器设置不匹配。运行
conan profile show default查看默认 profile,用conan profile update调整settings.compiler.version等字段 -
想跳过二进制重用、强制源码构建? 加
--build=missing(仅缺时构建)或--build=*(全部源码构建) -
多个子项目共享依赖? 推荐用
conan lock生成conan.lock文件,锁定所有传递依赖版本,确保可重现构建
Conan 的本质是“声明式依赖 + 自动生成构建上下文”,掌握 conan install、conanfile 和 CMake 集成这三点,就能覆盖绝大多数 C++ 项目依赖管理场景。











