运行 llc -version 可直接查看当前 llvm 编译时启用的目标架构,输出中 “available targets” 列出所有支持的后端(如 aarch64、arm、x86_64、riscv32 等),该列表由编译时 llvm_targets_to_build 参数决定,不匹配的目标三元组(如 -target)将报错 “unknown target triple”。

用 llc -version 查 LLVM 支持哪些目标架构
LLVM 编译时启用的后端决定了它能生成什么架构的代码。不查就直接写 -target,很可能报错 error: unknown target triple。运行 llc -version 是最直接的方式,输出里会列出所有已启用的 Available targets,比如:aarch64、arm、riscv32、riscv64、x86_64 等。
注意:这里只反映 LLVM 本身支持的后端,不等于你有对应系统的 C 库或头文件。比如 aarch64 在列表里,不代表你能直接编译出可运行的 Linux 程序——那还得配 aarch64-linux-gnu 的 sysroot。
目标三元组(triple)怎么拼:架构-供应商-系统
Clang 的 -target 参数必须是合法的三元组,格式为 <arch>-<vendor>-<sys></sys></vendor></arch>。常见组合不是靠猜,而是按实际设备环境定:
-
aarch64-linux-gnu:主流 ARM64 Linux 板(如树莓派 4/5、NVIDIA Jetson) -
armv7a-linux-gnueabihf:32 位 ARM,硬浮点,常见于旧款嵌入式 Linux -
arm-none-eabi:裸机 MCU(如 STM32、NXP i.MX RT),无 OS,用 EABI -
riscv64-unknown-elf:RISC-V 裸机,elf表示不依赖特定 OS ABI
其中 vendor 常为 unknown 或 none;sys 决定链接哪套 C 库:linux-gnu 要 glibc,none-eabi 或 unknown-elf 用 newlib 或 picolibc。
确认目标设备真实环境:别只看芯片型号
芯片型号(如“Cortex-A72”)只说明 CPU 架构,不等于整个运行环境。你得明确:
- 它跑的是 Linux 还是裸机?→ 决定用
linux-gnu还是none-eabi - 内核是 32 位还是 64 位?→ 对应
arm还是aarch64 - 用户空间用的是 glibc、musl 还是 uClibc?→ 影响 sysroot 里该放哪套库
- 是否启用 hard-float?→ 关系到
-mfloat-abi=hard是否可用,也影响 triple 后缀(如gnueabihf)
最稳妥的方式是登录目标设备,执行 uname -m 和 cat /proc/sys/kernel/ostype,再结合 readelf -A /bin/sh 看它的 ABI 类型。
交叉编译失败时先检查 triple 是否被识别
即使 triple 拼对了,Clang 也可能因缺少对应后端而静默降级或报错。验证方法很简单:
clang --target=armv7a-linux-gnueabihf -xc /dev/null -E -dM | head -5
如果输出预定义宏(如 __arm__、__linux__),说明 triple 被正确解析;如果报 error: invalid value 'armv7a-linux-gnueabihf' in '-target',那就得回退查 llc -version 或重新编译 LLVM 并指定 LLVM_TARGETS_TO_BUILD="ARM;AArch64"。
最容易被忽略的一点:triple 中的架构名必须和 LLVM 后端名严格一致。比如 armv8a 不是标准后端名,LLVM 只认 arm 或 aarch64;写成 aarch64-linux-gnu 才对,而不是 armv8a-linux-gnu。











