Conan需显式指定profile逐个构建多平台二进制,依赖profile精确声明settings(如os/arch/compiler.version)以生成唯一ID;交叉编译须用--profile:build与--profile:host分离环境,CI中应脚本化调用并清理构建目录防缓存污染。

用 conan create 配合不同 profile 生成多平台二进制
Conan 不会自动为多个平台批量构建,必须显式指定每个目标环境。核心是靠 profile 文件描述平台特征(OS、架构、编译器、标准库等),再逐个调用 conan create。
常见错误是只运行一次 conan create .,结果只生成当前机器默认 profile(比如本地 Linux x86_64 + GCC 12)的包,其他平台完全没覆盖。
- 先确保已有对应 profile:比如
conan profile show linux-armv7能列出内容,没有就用conan profile new --detect基础创建再手动改 - profile 中必须明确定义
settings.compiler.version、settings.arch、settings.os,缺一不可;否则 Conan 无法生成唯一二进制 ID - 调用时加
--profile:host=xxx(推荐)或直接--profile=xxx,避免误用构建机 profile - 若需交叉编译(如在 x86_64 Linux 上构建 aarch64 Android 包),必须同时提供
--profile:build和--profile:host
conan export-pkg 适合已有本地构建产物的场景
当你已经用 CMake/MSBuild 等工具在各平台上分别构建好了 .a、.so、.lib、.dll,不想重复编译,就该用 conan export-pkg —— 它跳过 source() 和 build(),只做打包和元数据注入。
典型误操作:在 conanfile.py 里还保留 def build(self): ...,但又想用 export-pkg,结果 Conan 会报错提示 “build() method not allowed”。
- 执行前删掉或注释掉
build()方法,只留package() - 命令形如:
conan export-pkg . mylib/1.0@user/channel --profile:host=windows-x86_64 --settings build_type=Release -
package()中的self.copy()必须指向你本地已存在的构建输出目录(如build/Release/),不能写死相对路径假设它一定存在 - 注意:这种方式不会校验源码一致性,适合封装第三方闭源 SDK 或 CI 中分阶段构建的产物
CI 中批量生成建议用脚本驱动 conan create
人工跑十几次 conan create 容易漏、难复现。CI 流程里应把 profile 名、settings 组合作为参数输入,而不是硬编码在命令里。
容易被忽略的是缓存污染:同一个 conan create 命令如果反复运行,Conan 默认会复用之前 build 目录(尤其 Windows 下 MSVC 中间文件残留),导致链接失败或 ABI 不一致。
- CI 中务必加
--build=missing或--build=outdated,避免意外复用旧构建 - 每次运行前清理 build 目录(
rm -rf build/或del /q build\*),或用--build-folder指定唯一路径(如build-linux-gcc12) - profile 文件建议放在项目根目录下(如
profiles/linux-gcc12),CI 脚本用--profile:host=profiles/linux-gcc12引用,便于版本控制 - 不要依赖
defaultprofile,它随 Conan 全局配置变化,CI 环境极易不一致
二进制 ID 冲突和共享问题必须提前验证
Conan 用完整 settings + options 计算二进制 ID。哪怕只是 compiler.libcxx=libstdc++11 和 libstdc++ 的微小差异,就会生成两个完全隔离的包。这既是灵活性来源,也是多平台发布中最容易翻车的地方。
常见现象:你在 macOS 上用 Clang 构建成功,但 Linux 用户 conan install 时提示 “Missing prebuilt package”,其实不是没上传,而是二进制 ID 对不上。
- 用
conan search mylib/1.0@user/channel -r remote-name查看远程实际有哪些二进制 ID - 用
conan inspect . --raw settings看当前 profile 解析出的完整 settings 列表,确认是否含os.kernel、os.subsystem等隐式字段 - Windows 下特别注意
compiler.runtime(MD/MT)和compiler.runtime_type(Dynamic/Static)必须显式设,否则可能被自动推断成非预期值 - 所有 profile 中的
settings.compiler.cppstd应统一(如都设为17),否则即使代码兼容,Conan 也会认为是不同 ABI
compiler.version=11,另一个写了 11.4,Conan 就当它们是两个世界的东西。每次新增平台,最好先用 conan create . --dry-run 看它算出的二进制 ID 是什么,再跟已上传列表对一遍。


















