用 rustup target add 添加交叉编译目标,再通过 cargo build --target 指定目标平台;musl 目标需配置 musl-gcc 链接器,macos arm64 目标需在 mac 上签名才能运行。

用 rustup 装交叉编译目标,不是装另一个 Rust
Windows 上想编译出 Linux 或 macOS 的二进制,核心不是换编译器,而是告诉当前 Rust 工具链:「我要生成别的平台的机器码」。这靠 rustup target add 完成,不是重装 Rust 或切到 WSL 里编译。
常见错误是以为得配 gcc 或 clang 交叉工具链——Rust 大部分目标(如 x86_64-unknown-linux-musl)自带代码生成能力,只需加 target 和对应链接器。
-
rustup target add x86_64-unknown-linux-musl:最常用,静态链接,无需目标系统有 glibc -
rustup target add aarch64-apple-darwin:编译 macOS ARM64,但仅限 Apple Silicon Mac;Windows 上不能生成 Intel macOS 二进制(Apple 不允许) -
x86_64-pc-windows-msvc是默认目标,别误加它来“交叉”
cargo build --target 必须指定,且不能只靠 Cargo.toml
即使加了 target,cargo build 默认仍走宿主平台(Windows)。不显式写 --target,就永远编译不出跨平台文件。
容易踩的坑是改了 Cargo.toml 里的 [build] 或 [profile.release],以为能默认生效——没用。Rust 不从配置文件读取 target,必须命令行传入。
- 正确:
cargo build --target x86_64-unknown-linux-musl --release - 错误:
cargo build --release(还是 Windows exe) - 输出路径在
target/x86_64-unknown-linux-musl/release/,不是target/release/
Linux musl 目标要配 musl-gcc 链接器,否则报 linker `cc` not found
加了 x86_64-unknown-linux-musl target 后,cargo build 很可能卡在链接阶段,报错类似 linker `cc` not found 或 failed to run custom build command for xxx。这不是 Rust 问题,是缺 musl 专用链接器。
Windows 上没有现成的 musl-gcc,得手动装:vcpkg install musl-x64-windows-static(推荐),或下载 musl.cc 提供的预编译工具链,解压后把 bin/ 加进 PATH。
- 在
.cargo/config.toml里配链接器:[target.x86_64-unknown-linux-musl] linker = "x86_64-linux-musl-gcc"
- 确保
x86_64-linux-musl-gcc命令能在终端直接运行,否则 cargo 找不到 - 别用
gcc或clang直接硬指——它们默认链接 glibc,和 musl 不兼容
macOS 目标在 Windows 上只能生成 Apple Silicon 二进制,且需签名才能运行
Windows 上通过 rustup target add aarch64-apple-darwin 编译出来的文件,是 macOS ARM64 架构的,能在 M1/M2/M3 Mac 上跑,但无法在 Intel Mac 上运行(Apple 不提供 x86_64-darwin 交叉工具链给非 macOS 系统)。
更关键的是:macOS 强制 Gatekeeper 检查,未签名的二进制双击直接拒绝运行,连终端执行都可能被拦截。
- 签名必须在 macOS 上用
codesign完成,Windows 无法替代 - 开发阶段可临时关 Gatekeeper:
sudo spctl --master-disable(仅限测试机) - 若项目依赖 macOS 特有 API(如
CoreFoundation),Windows 编译会直接失败,因为头文件不可用










