如何为 macOS 创建 Rust 通用二进制文件 (x86_64 & aarch64)

如何为 macOS 创建 Rust 通用二进制文件 (x86_64 & aarch64)

本文档将指导您如何将一个 Rust 项目编译并打包成一个 macOS 通用二进制文件,使其能够同时在搭载 Intel (x86_64) 和 Apple Silicon (aarch64) 芯片的 Mac 电脑上原生运行。

什么是通用二进制文件?

通用二进制文件(Universal Binary)是苹果公司的一种文件格式,它可以在一个可执行文件中包含多个架构的代码。这意味着同一个应用程序可以在不同类型的 Mac 电脑上以最佳性能运行,而无需用户下载不同版本的软件。

先决条件

在开始之前,请确保您的系统已安装以下工具:

  • Rust 工具链 : 包括 rustc 和 cargo。您可以通过 rustup 来管理它们。

操作步骤

以下是将 Rust 项目打包成通用二进制文件的详细步骤。

步骤 1: 安装目标平台

为了能够交叉编译到不同的架构,您需要使用 rustup 安装相应的目标平台工具链。

打开终端并运行以下命令来安装 Intel (x86_64) 和 Apple Silicon (aarch64) 的目标平台:

bash 复制代码
rustup target add x86_64-apple-darwin
rustup target add aarch64-apple-darwin

步骤 2: 为每个架构编译项目

接下来,您需要分别为两个目标平台编译您的 Rust 项目。请确保在发布模式 (--release) 下进行编译,以获得最佳性能。

为 Intel (x86_64) 平台编译:

bash 复制代码
cargo build --release --target x86_64-apple-darwin

为 Apple Silicon (aarch64) 平台编译:

bash 复制代码
cargo build --release --target aarch64-apple-darwin

编译完成后,您将在 target/x86_64-apple-darwin/release/ 和 target/aarch64-apple-darwin/release/ 目录下找到对应平台的可执行文件。

步骤 3: 使用 lipo 合并二进制文件

lipo 是一个 macOS 命令行工具,用于创建和操作通用文件。我们将使用它来将两个平台的可执行文件合并成一个单一的通用二进制文件。

首先,创建一个用于存放通用二进制文件的目录:

bash 复制代码
mkdir -p target/universal

然后,使用 lipo 命令进行合并。假设您的项目名称为 your_project_name:

bash 复制代码
lipo -create -output target/universal/your_project_name-universal \
     target/x86_64-apple-darwin/release/your_project_name \
     target/aarch64-apple-darwin/release/your_project_name

注意 : 请将 your_project_name 替换为您项目的实际名称。在我们的示例中,项目名称是 test-,可执行文件是 test-,最终的通用二进制文件是 test-universal。

步骤 4: 验证通用二进制文件

为了确保合并成功,您可以使用 file 命令来检查生成的可执行文件所包含的架构。

bash 复制代码
file target/universal/your_project_name-universal

如果命令成功执行,您应该会看到类似以下的输出,表明该文件同时包含了 x86_64 和 arm64 两种架构:

ini 复制代码
target/universal/your_project_name-universal: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64]

步骤 5: 运行可执行文件

现在,您可以直接运行这个通用二进制文件。系统会自动选择与当前 Mac 架构匹配的代码来执行。

bash 复制代码
./target/universal/your_project_name-universal

总结

通过以上步骤,您已经成功地将一个 Rust 项目打包成了一个适用于两种主流 Mac 芯片架构的通用二进制文件。这简化了软件的分发过程,并为所有用户提供了最佳的本地性能体验。

相关推荐
geovindu33 分钟前
rust: Semaphore Pattern
开发语言·后端·设计模式·rust·代理模式·企业级信号量模式·同步型模式
Thneonl2 小时前
Claude Code 频繁 Compacting?发布次日我根治了 2 个痛点
后端·rust
甘晴void18 小时前
我给 Magpie 做了个 macOS 桌宠:106 段动画,请求一多就亮灯
macos·electron·开源·deepseek·桌面宠物·magpie
还好还好不是吗19 小时前
我把开源项目托管给 AI 了:一句话提需求,AI 自己开发、自己测试、自己提 PR
electron
怪我冷i1 天前
Rust 智能指针 RefCell<T> 与内部可变性模式
rust
YOLOW921 天前
两周五个版本:我用 Rust 写的 AI 数据引擎 PageSift,0.81 系列做了什么
rust
西风测评1 天前
SSH 中文乱码的根源:locale、SendEnv 与 env 请求
rust
unconditional1 天前
我数了下 sdkm 的源码:41 个工具的安装逻辑,四分之三是同一行
rust·开源
栀椩1 天前
Electron 内嵌页面跨域问题(CORS/PNA)解决全记录
前端·javascript·electron
niyongsheng2 天前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust