在 Apple 生态中,aarch64 和 arm64 本质上是相同的架构,但在不同上下文中有细微区别:
核心区别
| 术语 | 使用场景 | 位数 | 别名关系 | 
|---|---|---|---|
| aarch64 | 官方 ARM 架构名称 (ARMv8-A 64位) | 64位 | ARM64 的标准化名称 | 
| arm64 | Apple/LLVM 的惯用命名 | 64位 | Apple 对 AArch64 的简称 | 
技术细节
- 指令集完全相同:
 
- 两者都指代 ARMv8-A 64位指令集
 - 二进制完全兼容
 
- 命名差异来源:
 
aarch64是 ARM 公司的官方术语arm64是 Apple/LLVM 生态的简化命名
- 
Apple 平台的特殊性:
Rust 目标三元组
aarch64-apple-darwin # Rust 官方命名
arm64-apple-darwin # 实际等价(但非标准写法)Xcode 中只识别 arm64
ARCHS = arm64 # 在 Build Settings 中
 
实践影响
- 
Rust 开发:
必须使用标准目标名称
rustup target add aarch64-apple-darwin # ✅ 正确
cargo build --target aarch64-apple-darwin以下写法会报错
cargo build --target arm64-apple-darwin # ❌ 错误
 - 
C/C++ 开发:
Clang 同时接受两种写法
-arch arm64 # ✅ Apple 惯例
-arch aarch64 # ✅ 也可工作 - 
二进制交互:
查看 Mach-O 文件架构
lipo -info libexample.a
输出显示为 arm64 (永远不会显示 aarch64)
 
历史背景
- ARMv8 发布时采用 
AArch64作为架构名称 - Apple 从 iOS 11 开始全面转向 64 位时,选择使用 
arm64作为营销名称 - LLVM 为保持兼容性同时支持两种写法
 
常见混淆场景
- 
跨平台构建时:
在 Cargo.toml 中指定目标
[target.aarch64-apple-darwin] # ✅
[target.arm64-apple-darwin] # ❌ 无效 - 
条件编译:
#[cfg(target_arch = "aarch64")] // ✅ 正确写法
#[cfg(target_arch = "arm64")] // ❌ 不会生效 - 
构建脚本中:
// build.rs 中检测架构
if cfg!(target_arch = "aarch64") { /.../ } // ✅ 
总结建议
- 在 Rust 生态中:
 
- 始终使用 
aarch64标准命名 - 目标三元组必须写 
aarch64-apple-darwin 
- 在 Xcode/macOS 开发中:
 
- 使用 
arm64作为架构标识 - 在 
ARCHS和VALID_ARCHS中配置 
- 
需要通用二进制时:
合并两种架构的正确写法
lipo -create
-output universal.a
x86_64/lib.a
aarch64/lib.a # 注意输入文件路径可能包含 arm64 目录名 
这种命名差异本质上是同一架构在不同生态中的术语偏好,实际使用时需注意上下文环境。