Conan添加第三方库依赖核心是写对conanfile并正确执行conan install;最轻量方式为conanfile.txt,需严格格式:[requires]下每行一个精确版本包名,[generators]推荐CMakeDeps+CMakeToolchain。

Conan 添加第三方库依赖,核心就两步:写对 conanfile.txt 或 conanfile.py,再跑对 conan install 命令。错一个字符、漏一个生成器、环境不匹配,都会导致 CMake 找不到库。
怎么写 conanfile 声明依赖
最轻量的方式是用 conanfile.txt —— 纯文本,适合简单项目。注意格式严格:空行分隔区块,[requires] 下每行一个包引用,[generators] 决定生成什么配置文件:
-
[requires]中的包名必须和 Conan Center(或你用的仓库)里完全一致,比如fmt/10.2.1,不是fmt或fmt@10.2.1 - 版本号推荐用精确版本(如
openssl/3.1.3),避免openssl/[*]导致 CI 构建结果不一致 -
[generators]推荐用CMakeDeps+CMakeToolchain(Conan 2.x 默认推荐),不要混用旧版cmake_find_package,后者在多配置构建(如 MSVC 的 Multi-Config)下会出问题
示例 conanfile.txt:
[requires] fmt/10.2.1 openssl/3.1.3 [generators] CMakeDeps CMakeToolchain
为什么 conan install 后 CMake 还是找不到库
常见原因是没把 Conan 生成的配置路径传给 CMake,或者生成器和 CMakeLists.txt 不配套:
-
conan install必须指定--output-folder=build(或其他你选的目录),否则生成的conan_toolchain.cmake和deps.cmake会散落在当前目录,CMake 找不到 - CMakeLists.txt 中必须用
include("${CMAKE_BINARY_DIR}/conan_toolchain.cmake")引入 toolchain,且要放在project()之前;find_package(fmt REQUIRED)才能生效 - 如果用了
CMakeDeps,CMakeLists.txt 里不能写find_package(fmt CONFIG REQUIRED)——CONFIG是多余的,CMakeDeps生成的是标准的find_package模式 - Windows 上用 MSVC 编译时,
conan install命令必须显式指定-s compiler.version=193 -s compiler.toolset=v143等,否则生成的依赖二进制可能和你的 CMake 构建环境不兼容
什么时候该换用 conanfile.py
当你遇到这些情况,conanfile.txt 就不够用了:
- 需要条件依赖:比如 Windows 下加
winflexbison/2.5.24,Linux 下加bison/3.8.2 - 要覆盖某个依赖的选项:比如
self.requires("zlib/1.2.13").options.shared = True - 想在
generate()里动态写 CMake 变量,或调用CMakeToolchain配置cppstd、compiler.libcxx - 项目要发布为 Conan 包,需要定义
exports_sources、package()等逻辑
这时直接上 conanfile.py 更可控。它本质是 Python 类,requires() 方法里声明依赖,generate() 方法里调用 CMakeToolchain 和 CMakeDeps 即可。
容易被忽略的兼容性坑
Conan 2.x 默认按「设置(settings)」区分二进制,哪怕只改了一个 setting,也会触发重新构建:
-
compiler.libcxx=libstdc++11(GCC)和compiler.libcxx=libc++(Clang)是两个完全不同的包,不能混用 - macOS 上默认
os.sdk=macosx,但如果你在 Xcode 里设了MACOSX_DEPLOYMENT_TARGET=11.0,Conan 也得同步设-s os.sdk=macosx -s os.version=11.0,否则链接失败 - 交叉编译(如 ARM64 Linux)时,
conan install必须带完整 profile 或显式-pr:b default -pr:h your_arm_profile,否则 host 和 build 工具链会乱套 - 私有仓库的包若用了
@user/channel格式(如mylib/1.0@team/stable),必须先conan remote add添加对应远程源,否则报Package not found
真正卡住人的往往不是“怎么加”,而是“加完之后为什么不用”。检查 build/conan_toolchain.cmake 是否存在、内容是否含你想要的库、CMake 输出里有没有 Found fmt,比重装 Conan 有用得多。


















