可用的arm profile必须严格匹配目标平台的编译器、sysroot和abi,例如命名~/.conan2/profiles/armv7-gcc11,内容需含[settings] os=linux arch=armv7 compiler=gcc compiler.version=11 compiler.libcxx=libstdc++11 compiler.cppstd=17 build_type=release及[conf] tools.build:sysroot=/opt/sysroot-armhf等真实路径与版本,且conan create时须显式指定--profile:host=armv7-gcc11,否则默认使用本地x86 profile导致包id错误。

直接用 conan create 配合 ARM profile 就能生成,但关键不在命令本身,而在 profile 是否真实匹配目标平台的编译器、sysroot 和 ABI —— 否则生成的包 ID 无效,下游链接会失败或运行时崩溃。
怎么写一个可用的 ARM profile
profile 不是随便改个 arch=armv7 就行。它必须和你实际交叉编译环境一致,尤其是 compiler、compiler.version、compiler.libcxx 和 sysroot 路径。
-
~/.conan2/profiles/armv7-gcc11是常见命名,内容需包含:[settings] os=Linux arch=armv7 compiler=gcc compiler.version=11 compiler.libcxx=libstdc++11 compiler.cppstd=17 build_type=Release [conf] tools.cmake.cmaketoolchain:generator=Ninja tools.build:sysroot=/opt/sysroot-armhf
- 如果用的是
arm-linux-gnueabihf-gcc,compiler必须设为gcc,不能写成armgcc(Conan 不识别);版本号得和arm-linux-gnueabihf-gcc --version输出一致 -
sysroot必须指向真实存在的路径,且里面要有usr/include和usr/lib,否则conan create在 configure 阶段就会报Could not find a package configuration file
conan create 时为什么总生成 x86 包
这是 profile 没生效的典型表现。Conan 默认用系统本地 profile,不会自动读取你写的 ARM 文件。
- 必须显式指定:
conan create . --profile:build=default --profile:host=armv7-gcc11 -
--profile:build是构建 Conan 工具链的机器(通常是你的 x86 开发机),--profile:host才是目标平台 —— 漏掉:host就等于没切架构 - 检查是否真在用目标 profile:
conan create . --profile:host=armv7-gcc11 -v,看日志里Host profile行输出是否匹配你文件名 - 如果 profile 路径含空格或中文,Conan 会静默忽略,改用默认 profile,不报错也不提示
预编译库怎么塞进 ARM 包(不用源码编译)
当你只有 libfoo.a 和 include/foo.h,又不想跑 build(),就用 conan export-pkg,但它对 profile 的依赖更严格 —— 因为包 ID 完全由 profile 决定,错一点就无法被 ARM 项目识别。
- 先确保目录结构清晰:
./mylib/ ├── include/ │ └── foo.h └── lib/ └── libfoo.a - 执行:
conan export-pkg . foo/1.0@ --profile:host=armv7-gcc11 --user=user --channel=stable -
--profile:host必须和下游项目conan install时用的完全一致,包括所有 settings 值(比如build_type=Release缺一不可) - 别用
conan export替代 —— 它只注册 recipe,不关联二进制,下游conan install仍会尝试从源码构建
最容易被忽略的是:ARM 包一旦上传到远程,其 package_id 就永久绑定 profile 的全部 settings。如果你后来改了 sysroot 路径或升级了 gcc 版本,旧包无法复用,必须重新 export-pkg 或 create —— 不是缓存问题,是 Conan 的二进制兼容性模型决定的。











