“bad cpu type in executable”是macos execve()系统调用抛出的运行时错误(errno 86),表明二进制架构与当前cpu不匹配;clang编译阶段不报此错,仅负责生成目标文件,问题出在后续执行时——如m系列芯片运行x86_64二进制且未装rosetta,或intel mac运行arm64二进制。

bad CPU type in executable 不是 Clang 报的错,而是 macOS 的 execve() 系统调用在尝试加载二进制时抛出的运行时错误(errno 86)。Clang 编译阶段不会报这个,它只管生成目标文件;真正触发该错误的是你后续执行某个可执行文件时,系统发现它的 CPU 架构和当前机器不匹配。
为什么 clang 编译完却跑不起来?
Clang 默认会根据你当前 host 架构生成对应二进制(比如在 M3 上编译,默认输出 aarch64),但如果你手动指定了 -arch x86_64 却没装 Rosetta,或交叉编译后忘了适配目标平台,就容易在运行时撞上这个错误。
- 你在 M3/M2/M1 Mac 上运行一个只含
x86_64的 binary,但没装 Rosetta → 报错 - 你在 Intel Mac 上运行一个只含
arm64的 binary → 报错 - Clang 编译时用了
-arch x86_64 -arch arm64,但链接时漏了-dynamiclib或没设对-install_name,导致最终产物仍是单架构 → 运行时仍可能失败 - 你用
make或构建脚本调用了旧版工具链(比如从 Intel 时代拷来的gcc或ld),它们默认只产出x86_64→ 在 Apple Silicon 上直接挂
怎么快速确认是不是架构问题?
别猜,直接查:
Clang 22.1.3 Windows 64 位历史版本安装包,适合旧项目兼容、LLVM/Clang 工具链回退、编译行为对比、链接问题复现和 C/C++ 构建环境维护。
- 看当前机器架构:
uname -m(输出arm64或x86_64) - 看二进制支持哪些架构:
lipo -info /path/to/binary - 看它具体包含什么段:
file /path/to/binary(留意输出里有没有arm64、x86_64或Mach-O字样) - 如果
lipo -info报错 “not a universal binary”,说明它只有一种架构,且很可能不匹配你的 CPU
常见修复路径(按优先级排序)
先判断你是「运行别人给的二进制」还是「自己编译后运行失败」:
- 如果是运行第三方工具(如
wkhtmltopdf、protoc、node):
→ 先brew uninstall && brew install,Homebrew 会自动选对架构;
→ 如果不行,查官网下载页,明确选ARM64(M1/M2/M3)或x86_64(Intel)版本 - 如果是你自己用 Clang 编译的:
→ 确保没硬编码-arch x86_64且又在 Apple Silicon 上直接运行;
→ 想兼容双平台,加-arch x86_64 -arch arm64,并用lipo -create合并(或让 Clang 自动处理,Xcode 默认开启);
→ 检查./configure或 CMake 是否传了-DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" - 如果只是临时跑一下旧工具:
→ 安装 Rosetta:/usr/sbin/softwareupdate --install-rosetta --agree-to-license;
→ 或强制用 x86_64 shell:arch -x86_64 zsh,再执行命令
最容易被忽略的一点:Xcode 命令行工具(xcode-select --install)和 Clang 版本必须匹配你当前系统。M3 上装了 Xcode 15.3,但命令行工具还是旧版(比如从 Intel 时代遗留),就会静默产出 x86_64 二进制——clang --version 和 xcode-select -p 得一起核对。










