Rust如何在Linux上跨平台运行
介绍Rust在Linux上的跨平台运行实践,包括安装工具链、交叉编译(指定目标三元组并配置链接器)、条件编译与依赖管理、在x86_64主机为ARM64构建程序(使用QEMU验证),以及打包分发(生成.deb/.rpm)和CI自动化(GitHubActions矩阵构建)等内容。
Rust 在 Linux 上的跨平台运行实践

先从基础准备说起。
一 准备与基础
要在Linux上玩转Rust的跨平台能力,第一步自然是搞定工具链。用rustup来安装和管理Rust,这是目前最主流也最省心的方式。
- 安装命令:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh - 验证安装:
rustc --version、cargo --version
工具链就绪之后,新建一个项目试试手:cargo new my_app && cd my_app。基础运行无非就是cargo build和cargo run这两兄弟。如果要追求极致性能,发布时记得用cargo build --release。
二 交叉编译到不同平台
交叉编译是Rust跨平台的精髓所在。它的核心逻辑是:在本地开发机上为其他架构的CPU编译可执行文件。
这里的“其他架构”由目标三元组(target triple)来标识,比如:
x86_64-unknown-linux-gnu:经典的x86_64 Linux平台aarch64-unknown-linux-gnu:ARM64架构的Linuxx86_64-pc-windows-msvc:64位Windows平台
先查看一下当前支持哪些目标:rustup target list。然后添加你需要的:rustup target add x86_64-unknown-linux-gnu aarch64-unknown-linux-gnu。
但光是添加目标还不够,还需要一个关键的桥梁——链接器。在.cargo/config.toml中为目标配置交叉链接器。以ARM64为例:
- 安装交叉工具链:
sudo apt-get install gcc-aarch64-linux-gnu - 在
.cargo/config.toml配置:[target.aarch64-unknown-linux-gnu]linker = "aarch64-linux-gnu-gcc"
配置完毕之后,就可以执行交叉构建了:
- Linux目标:
cargo build --target aarch64-unknown-linux-gnu --release - Windows目标:
cargo build --target x86_64-pc-windows-gnu --release
编译产物会存放在target/目录下。
三 条件编译与依赖管理
跨平台开发中,代码本身也需要学会“看人下菜碟”。条件编译就是解决这个问题的利器。
最直观的方式是直接在代码中使用cfg!或#[cfg()]属性:
#[cfg(target_os = "linux")]fn os_specific() { println!("Linux!"); }#[cfg(target_arch = "aarch64")]fn arch_specific() { println!("ARM64!"); }fn main() {if cfg!(target_os = "linux") { os_specific(); }if cfg!(target_arch = "aarch64") { arch_specific(); }}
依赖管理同样可以按目标进行差异化配置。在Cargo.toml中,可以指定不同平台下的依赖:
[target.'cfg(windows)'.dependencies]winapi = { version = "0.3", features = ["fileapi"] }[target.'cfg(unix)'.dependencies]libc = "0.2"[target.'cfg(target_arch = "wasm32")'.dependencies]wasm-bindgen = "0.2"
另外,路径处理是跨平台开发中最容易翻车的地方。务必使用std::path来处理路径,避免硬编码分隔符。必要时用cfg来区分不同平台的逻辑。
四 在 Linux 上交叉编译 Linux 多架构
一个非常常见的场景是:在x86_64的主机上为ARM64的树莓派或服务器构建程序。
操作步骤其实很简单:
- 安装工具链:
sudo apt-get install gcc-aarch64-linux-gnu - 在
.cargo/config.toml配置链接器:aarch64-linux-gnu-gcc - 构建:
cargo build --target aarch64-unknown-linux-gnu --release
如果想在本地验证ARM64二进制能否正常运行,可以用QEMU来模拟:
- 安装QEMU:
sudo apt-get install qemu-user - 运行:
qemu-aarch64 ./target/aarch64-unknown-linux-gnu/release/your_binary
不过,更稳妥的方式还是把产物拷贝到目标设备上测试,或者通过SSH在目标上执行。毕竟,模拟环境只能保证“能跑起来”,真正的行为一致性还得靠真机验证。
五 打包分发与 CI 自动化
当代码写好了、交叉编译也搞定了,接下来就是如何优雅地打包分发。
Linux发行包方面:
- Debian系:
cargo install cargo-deb,然后cargo deb --release生成.deb - RHEL/CentOS系:
cargo install cargo-rpm,然后cargo rpm --release生成.rpm
如果你觉得每次手动配置交叉工具链太麻烦,可以考虑使用cross——一个基于Docker的构建工具。安装只需cargo install cross,构建命令是cross build --target x86_64-unknown-linux-gnu。它将所有的环境配置都封装在Docker镜像中,省心不少。
在CI环境中自动化整个流程就更香了。以GitHub Actions为例,可以配置矩阵构建,同时对多个目标进行编译和测试:
name: CIon: [push, pull_request]jobs:build:runs-on: ubuntu-lateststrategy:matrix:target: [x86_64-unknown-linux-gnu, aarch64-unknown-linux-gnu, x86_64-pc-windows-gnu]steps:- uses: actions/checkout@v4- uses: actions-rs/toolchain@v1with:toolchain: stabletarget: ${{ matrix.target }}override: true- run: cargo build --target ${{ matrix.target }} --release- run: cargo test --target ${{ matrix.target }} --release
最后,几个实用建议:
- 优先静态链接(比如使用musl)。静态链接能大幅减少运行时依赖,便于分发。若采用动态链接,必须确保目标系统具备对应的glibc版本,否则会面临“找不到库”的尴尬。
- 减小二进制体积:使用
strip target/,效果立竿见影。/release/your_binary - 注意C依赖:如果项目中包含了需要C语言库的crate(比如openssl-sys),交叉编译时需要准备好目标架构的头文件和库,或者直接使用发行版提供的交叉库。


































