在 Linux 上利用 Rust 的跨平台特性
一 环境准备与项目初始化
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh,随后执行 source $HOME/.cargo/env。cargo new my_app && cd my_app;构建与运行:cargo build --release、cargo run --release。二 代码层面的跨平台实践
#[cfg(target_os = "linux")]、#[cfg(target_os = "windows")] 等属性,仅在对应平台编译代码块。cfg!(target_os = "...") 在运行时分支逻辑。[target.'cfg(unix)'.dependencies]
libc = "0.2"
[target.'cfg(windows)'.dependencies]
winapi = "0.3"
三 交叉编译与多目标构建
rustup target list 查看可用目标;通过 rustup target add <triple> 安装所需目标的标准库。x86_64-pc-windows-gnux86_64-unknown-linux-gnux86_64-unknown-linux-muslx86_64-apple-darwinaarch64-apple-darwinaarch64-linux-androidwasm32-unknown-unknownsudo apt-get install mingw-w64(Debian/Ubuntu)或 sudo dnf install mingw64-gcc(Fedora/RHEL)。rustup target add x86_64-pc-windows-gnu。[target.x86_64-pc-windows-gnu]
linker = "x86_64-w64-mingw32-gcc"
cargo build --target x86_64-pc-windows-gnu --release,产物位于 target/x86_64-pc-windows-gnu/release/,扩展名为 .exe。sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf
rustup target add aarch64-unknown-linux-gnu、rustup target add armv7-unknown-linux-gnueabihf。[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc"
[target.armv7-unknown-linux-gnueabihf]
linker = "arm-linux-gnueabihf-gcc"
cargo build --target aarch64-unknown-linux-gnu --release。cargo build --target x86_64-unknown-linux-musl --release。四 打包分发与持续集成
cargo install cargo-deb,随后 cargo deb --release 生成 .deb。cargo install cargo-rpm,随后 cargo rpm --release 生成 .rpm。.github/workflows/ci.yml 中使用矩阵构建多平台:name: CI
on: [push, pull_request]
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- uses: actions/checkout@v4
- name: Install Rust
run: rustup default stable
- name: Build
run: cargo build --release
- name: Run tests
run: cargo test --release
x86_64-pc-windows-gnu 目标。五 常见问题与排查要点
linker 'aarch64-linux-gnu-gcc' not found,先确认交叉编译器已安装并在 PATH,或在 .cargo/config.toml 显式设置 linker,亦可通过环境变量指定:CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=/usr/bin/aarch64-linux-gnu-gcc \
cargo build --target aarch64-unknown-linux-gnu
PKG_CONFIG_PATH=/usr/aarch64-linux-gnu/lib/pkgconfig \
cargo build --target aarch64-unknown-linux-gnu