在 Apple 生态中,`aarch64` 和 `arm64` 本质上是相同的架构

在 Apple 生态中,aarch64arm64 本质上是相同的架构,但在不同上下文中有细微区别:

核心区别

术语 使用场景 位数 别名关系
​aarch64​ 官方 ARM 架构名称 (ARMv8-A 64位) 64位 ARM64 的标准化名称
​arm64​ Apple/LLVM 的惯用命名 64位 Apple 对 AArch64 的简称

技术细节

  1. ​指令集完全相同​
  • 两者都指代 ARMv8-A 64位指令集
  • 二进制完全兼容
  1. ​命名差异来源​
  • aarch64 是 ARM 公司的官方术语
  • arm64 是 Apple/LLVM 生态的简化命名
  1. ​Apple 平台的特殊性​

    Rust 目标三元组

    aarch64-apple-darwin # Rust 官方命名
    arm64-apple-darwin # 实际等价(但非标准写法)

    Xcode 中只识别 arm64

    ARCHS = arm64 # 在 Build Settings 中

实践影响

  1. ​Rust 开发​

    必须使用标准目标名称

    rustup target add aarch64-apple-darwin # ✅ 正确
    cargo build --target aarch64-apple-darwin

    以下写法会报错

    cargo build --target arm64-apple-darwin # ❌ 错误

  2. ​C/C++ 开发​

    Clang 同时接受两种写法

    -arch arm64 # ✅ Apple 惯例
    -arch aarch64 # ✅ 也可工作

  3. ​二进制交互​

    查看 Mach-O 文件架构

    lipo -info libexample.a

    输出显示为 arm64 (永远不会显示 aarch64)

历史背景

  • ARMv8 发布时采用 AArch64 作为架构名称
  • Apple 从 iOS 11 开始全面转向 64 位时,选择使用 arm64 作为营销名称
  • LLVM 为保持兼容性同时支持两种写法

常见混淆场景

  1. ​跨平台构建时​

    在 Cargo.toml 中指定目标

    [target.aarch64-apple-darwin] # ✅
    [target.arm64-apple-darwin] # ❌ 无效

  2. ​条件编译​

    #[cfg(target_arch = "aarch64")] // ✅ 正确写法
    #[cfg(target_arch = "arm64")] // ❌ 不会生效

  3. ​构建脚本中​

    // build.rs 中检测架构
    if cfg!(target_arch = "aarch64") { /.../ } // ✅

总结建议

  1. ​在 Rust 生态中​
  • 始终使用 aarch64 标准命名
  • 目标三元组必须写 aarch64-apple-darwin
  1. ​在 Xcode/macOS 开发中​
  • 使用 arm64 作为架构标识
  • ARCHSVALID_ARCHS 中配置
  1. ​需要通用二进制时​

    合并两种架构的正确写法

    lipo -create
    -output universal.a
    x86_64/lib.a
    aarch64/lib.a # 注意输入文件路径可能包含 arm64 目录名

这种命名差异本质上是同一架构在不同生态中的术语偏好,实际使用时需注意上下文环境。