温馨提示×

Rust如何在Linux上跨平台运行

小樊
37
2025-11-16 16:16:14
栏目: 编程语言

Rust 在 Linux 上的跨平台运行实践

一 准备与基础

  • 安装工具链:使用 rustup 安装和管理 Rust,完成后确保工具链可用。
    • 安装命令:curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    • 验证:rustc --versioncargo --version
  • 新建项目:cargo new my_app && cd my_app
  • 基础运行:cargo buildcargo run(如需优化发布用 cargo build --release

二 交叉编译到不同平台

  • 查看与添加目标:使用目标三元组标识平台,例如 x86_64-unknown-linux-gnuaarch64-unknown-linux-gnux86_64-pc-windows-msvc
    • 查看:rustup target list
    • 添加:rustup target add x86_64-unknown-linux-gnu aarch64-unknown-linux-gnu
  • 指定链接器:在 .cargo/config.toml 为目标配置交叉链接器(以 aarch64 为例)
    • 安装交叉工具链:sudo apt-get install gcc-aarch64-linux-gnu
    • 配置:
      [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//release/

三 条件编译与依赖管理

  • 条件编译:按目标系统或架构编译不同代码
    • 示例:
      #[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 主机上为 aarch64 设备构建
    • 安装工具链:sudo apt-get install gcc-aarch64-linux-gnu
    • 配置链接器(.cargo/config.toml):
      [target.aarch64-unknown-linux-gnu]
      linker = "aarch64-linux-gnu-gcc"
      
    • 构建:cargo build --target aarch64-unknown-linux-gnu --release
  • 本机运行验证(可选):借助 QEMU 在主机上运行 ARM 二进制
    • 安装:sudo apt-get install qemu-user
    • 运行:qemu-aarch64 ./target/aarch64-unknown-linux-gnu/release/your_binary
  • 远程/CI 验证:将产物拷贝到目标设备或通过 SSH 在目标上执行测试,确保运行时行为一致

五 打包分发与 CI 自动化

  • Linux 发行包:
    • Debian 系cargo install cargo-debcargo deb --release 生成 .deb
    • RHEL/CentOS 系cargo install cargo-rpmcargo rpm --release 生成 .rpm
  • 简化交叉编译:使用 cross(基于 Docker 的构建工具)
    • 安装:cargo install cross
    • 构建:cross build --target x86_64-unknown-linux-gnu
  • CI 示例(GitHub Actions):在矩阵中覆盖多个目标并运行测试
    name: CI
    on: [push, pull_request]
    jobs:
      build:
        runs-on: ubuntu-latest
        strategy:
          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@v1
            with:
              toolchain: stable
              target: ${{ matrix.target }}
              override: true
          - run: cargo build --target ${{ matrix.target }} --release
          - run: cargo test --target ${{ matrix.target }} --release
    
  • 实用建议:
    • 优先静态链接(如 musl)可减少运行时依赖,便于分发;动态链接需确保目标系统具备对应 glibc 版本
    • 使用 strip 减小二进制体积:strip target/<target>/release/your_binary
    • 对含 C 依赖的 crate,交叉编译时准备目标架构的 头文件与库(或使用发行版提供的交叉库)

0