macOS 系统下交叉编译 Rust 为 Linux musl 目标(x86_64 和 aarch64 架构)


2026 更新:本文命令已按当前 homebrew-musl-cross 的行为做了小幅修正。现在默认安装后会同时提供 x86_64-linux-musl-*aarch64-linux-musl-*arm-linux-musleabihf-* 等工具链,不再需要为了 aarch64 单独重新安装。

Rust 支持交叉编译,可以 macOS 平台编译出 Linux 或者 Windows 可运行的程序,或者在 Linux 平台编译 macOS 或者 Windows 可运行的程序。

这篇文章主要讲解 Mac 平台编译为 Linux 平台的二进制程序。

环境

Build:macOS

OS:Apple M2 - Darwin Kernel Version 22.1.0 / arm64 rustc:rustc 1.72.1 (d5c2e9c34 2023-09-13) rustup:rustup 1.26.0 (5af9b9484 2023-04-05)

Target:linux x86_64

OS:18.04.1-Ubuntu x86_64 GNU/Linux

Target:linux aarch64

OS:20.04.1-Ubuntu aarch64 GNU/Linux

准备示例

$ cargo new --bin hello-rust

文件 main.rs

fn main() {
    println!("Hello World!\n");
}

编译为 Linux 平台(x86_64)

如果希望在 macOS 上交叉编译出较便携的 Linux 可执行文件,可以选择 *-unknown-linux-musl 目标。musl 是 Linux 平台上的 C 标准库实现之一,常用于静态链接和轻量化部署场景。

这里选择 musl,并不是说 Linux 程序只能使用 musl;常见 Linux 发行版更多使用 glibc。选择 musl 的主要原因是它更适合生成较易分发的静态链接二进制文件。

musl 是一个面向 Linux 的 C 标准库实现,设计目标包括轻量、简单、标准兼容和便于静态链接。Rust 的 x86_64-unknown-linux-muslaarch64-unknown-linux-musl 等 target 会使用 musl 相关工具链来生成 Linux musl 目标平台的可执行文件。

musl 工具链在 macOS 上使用 musl-cross 进行安装,musl-cross 是用来专门编译到 Linux 的工具链:

$ brew install filosottile/musl-cross/musl-cross

安装完成后,会提供类似下面这些交叉编译工具:

  • x86_64-linux-musl-gcc
  • aarch64-linux-musl-gcc
  • arm-linux-musleabihf-gcc

添加 Target

$ rustup target add x86_64-unknown-linux-musl
$ rustup target add aarch64-unknown-linux-musl

将以下内容写入配置文件:.cargo/config.toml

.cargo/config 仍然可以被 Cargo 读取,但现在更推荐使用 .cargo/config.toml 这个文件名。

mkdir -p .cargo
vim .cargo/config.toml
[target.x86_64-unknown-linux-musl]
linker = "x86_64-linux-musl-gcc"

[target.aarch64-unknown-linux-musl]
linker = "aarch64-linux-musl-gcc"

编译

$ cargo build --release --target=x86_64-unknown-linux-musl

如果只是本地验证,也可以去掉 --release;如果是准备部署到 Linux 服务器,通常建议使用 --release

如果不修改 .cargo/config.toml 配置文件,可以执行 $ RUSTFLAGS="-C linker=x86_64-linux-musl-gcc" cargo build --release --target=x86_64-unknown-linux-musl

编译后,在 target 目录下的 x86_64-unknown-linux-musl 文件夹可以找到编译后的程序

将程序拷贝到目标机器执行

# ubuntu @ ip-172-11-22-33 in ~ [3:35:37]
$ uname -a
Linux ip-172-11-22-33 5.4.0-1103-aws #111~18.04.1-Ubuntu SMP Tue May 23 20:04:10 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

# ubuntu @ ip-172-11-22-33 in ~ [3:35:40]
$ /tmp/hello-rust
Hello, world!

编译为 Linux 平台(aarch64)

旧版本或旧文档中可能需要通过 Homebrew 参数选择不同架构;现在默认安装后已经同时包含 amd64、arm64、arm 等常见 musl Linux 交叉工具链。

编译

$ cargo build --release --target=aarch64-unknown-linux-musl

将程序拷贝到目标机器执行

 ubuntu@ip-172-22-33-44 ~ $ uname -a
Linux ip-172-22-33-44 5.15.0-1028-aws #32~20.04.1-Ubuntu SMP Mon Jan 9 18:02:12 UTC 2023 aarch64 aarch64 aarch64 GNU/Linux
 ubuntu@ip-172-22-33-44 ~ $ /tmp/hello-rust
Hello, world!

参考