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-musl、aarch64-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-gccaarch64-linux-musl-gccarm-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!