Conan 的二进制兼容性取决于 profile 和 settings 的严格一致,需统一管理 profile 文件、显式配置 package_id_mode,并优先使用 conanfile.py 实现可控打包;其灵活性要求主动管控而非默认配置。

Conan 能为 C++ 项目提供跨平台、可复现、支持私有仓库的二进制依赖管理,但默认不强制绑定编译器/架构/构建类型等配置,容易因 settings 不一致导致二进制不兼容——这是比 vcpkg 更需要主动管控的关键点。
Conan 的 profile 和 settings 决定二进制是否能复用
Conan 不像 vcpkg 那样按“triplet”(如 x64-windows-static-md)隐式锁定全部构建维度;它靠显式的 profile 文件和 settings(如 compiler.version=14, build_type=Debug)组合生成二进制 ID。一旦本地 profile 和远程包的 settings 不匹配,Conan 就会尝试源码编译或报错 Unable to find 'xxx' in remotes。
- 用
conan profile show default查看当前 profile 实际生效的settings - 确保 CI、团队成员、不同机器都用同一份 profile(推荐存为
conan/profiles/linux-gcc11-release),而非依赖default - 调试时加
-v参数:例如conan install . -v,看日志里实际解析出的settings是什么
conanfile.py vs conanfile.txt:什么时候必须写 Python?
conanfile.txt 只能声明依赖和基础选项,而 conanfile.py 才能控制源码获取、构建逻辑、包结构、条件依赖等——尤其当你需要 patch 第三方库、切换 CMake 构建参数、或封装自己项目的 SDK 时,conanfile.py 是唯一选择。
-
conanfile.txt适合快速试用公开包,例如:[requires] zlib/1.2.13 fmt/10.2.1 [generators] CMakeDeps CMakeToolchain
-
conanfile.py必须重写source(),build(),package()方法才能真正“打包”;漏掉package()就不会生成可安装的二进制 - 不要在
conanfile.py中硬编码路径(如os.path.join("src", "CMakeLists.txt")),应使用self.source_folder等 Conan 提供的属性
vcpkg.json 的“全局 triplet” vs Conan 的“per-dependency options”
vcpkg 通过 vcpkg.json + 全局 triplet 统一约束所有依赖的构建方式,简单粗暴;Conan 则允许对每个依赖单独设置 options,比如:openssl:no_zlib=True、boost:shared=False。这更灵活,但也更容易因选项冲突导致链接失败。
立即学习“C++免费学习笔记(深入)”;
- 查某个包支持哪些 option:运行
conan inspect zlib/1.2.13 --raw options - 在
conanfile.txt中指定:[options] zlib:fPIC=True openssl:shared=False
- 注意 option 名称大小写敏感,且不同版本包的 option 可能不兼容(例如
fmt/9.x用fmt:header_only,fmt/10.x改为fmt:header-only)
上传到私有 Artifactory/Nexus 前必须 verify package_id
Conan 的 package_id 是由 settings + options + requires.package_id_mode 共同计算出的哈希值。如果没显式配置 package_id_mode,默认是 semver_direct,即只对直接依赖做语义化版本收敛——这意味着你升级了间接依赖(如 boost → boost/1.84.0),但你的包 package_id 不变,别人下载时仍会复用旧二进制,可能引发 ABI 不兼容。
- 在
conanfile.py中显式声明:self.info.requires["boost"].full_package_mode() - 上传前用
conan create . --build=missing -tf=None测试能否成功生成包,并检查日志中Package ID:是否符合预期 - 私有仓库里一个
package_id对应唯一二进制;删错包或改错package_id_mode后,旧二进制就永远无法被命中
Conan 的灵活性来自对 settings、options、package_id_mode 的精细控制,而不是“配好就能跑”。很多问题不是 Conan 本身缺陷,而是 profile 和依赖声明没对齐——建议把 profile 和 conanfile 一起纳入 Git,而不是靠文档口头约定。











