arch值必须与目标硬件指令集严格对齐,填错不会报错但会导致段错误或符号未定义,因ABI、寄存器宽度和调用约定全部错配;Conan用其参与package ID计算并约束构建逻辑,如armv8对应aarch64,x86_64是标准写法,需与CC、sysroot自洽闭环。

arch 值必须和目标硬件指令集严格对齐
填错 arch 不会报错,但会导致生成的二进制在目标板上直接段错误或符号未定义——因为 ABI、寄存器宽度、调用约定全错了。Conan 用它参与计算 package ID,也用于约束 recipe 中的构建逻辑(比如某些库在 arch=armv7 下禁用 NEON)。
-
armv8对应 64 位 ARM(即aarch64),不是arm64(后者是 macOS 的叫法,Conan 不认) -
x86_64是标准写法,别写成amd64或x64 - ARM32 要区分:
armv7(带 Thumb-2)、armv7hf(硬浮点 ABI),不能只写arm - 如果你用的是 Raspberry Pi 4(64 位内核+用户空间),填
arch=armv8;如果是 Pi 3B+ 默认 32 位系统,得看uname -m输出:若为armv7l,就填armv7
profile 里 arch 和编译器前缀、sysroot 必须自洽
单独把 arch 填对没用,它得和 [buildenv] 里的 CC、[conf] 里的 tools.build:sysroot 形成闭环。比如:
-
arch=armv8→CC必须是aarch64-*系列(如aarch64-poky-linux-gcc),不能是arm-poky-linux-gnueabi-gcc -
arch=x86_64+os=Linux→CC应该是x86_64-linux-gnu-gcc或本地gcc,且sysroot路径下要有lib64/而非lib/ - 混用
arch=armv8和CC=arm-linux-gnueabihf-gcc会导致链接时找不到__aeabi_idiv这类 ARM32 符号
交叉 profile 里不要依赖 conan profile detect 自动推断 arch
conan profile new myprofile --detect 在宿主机上跑,只会读 uname -m,永远返回你当前机器的架构(比如 x86_64),对交叉编译完全无效。必须手动写死。
- 检查目标平台真实架构最靠谱的方式:
readelf -A /path/to/target/binary | grep Tag_ABI_VFP_args或直接看 SDK 文档 - 常见嵌入式组合示例:
[settings] os=Linux arch=armv8 compiler=gcc compiler.version=12 compiler.libcxx=libstdc++ build_type=Release
- 如果项目要同时支持 ARM64 和 RISC-V,就得建两个 profile(如
profiles/arm64-release和profiles/riscv64-release),不能靠一个 profile 动态切换
recipe 里读取 arch 做条件判断要小心 ABI 细节
你在 conanfile.py 里用 self.settings.arch 控制编译选项时,注意 Conan 的 arch 是逻辑值,不等于 GCC 的 -march。比如:
-
self.settings.arch == "armv8"可以用来开关-march=armv8-a+crypto,但不能直接当-mcpu用 - 某些库(如 OpenSSL)在
arch=armv8下默认启用asm加速,若目标芯片不支持 AES 指令,得额外关掉:self.options["openssl"].no_asm = True - 别在
package_id()里忽略arch—— 即使你打的是 static lib,不同arch的符号表和重定位方式也不同
arch 很难当场发现,往往到烧写进设备、跑第一行代码才崩。最省事的办法:把 SDK 提供的 toolchain.cmake 里写的 CMAKE_SYSTEM_PROCESSOR 值,原样抄进 profile 的 arch= 后面。


















