跳到主要内容

交叉编译问题

问题

如何将 Rust 项目编译到不同的目标平台?

答案

基本交叉编译

# 添加目标平台
rustup target add x86_64-unknown-linux-musl
rustup target add aarch64-unknown-linux-gnu
rustup target add x86_64-pc-windows-gnu

# 编译到 Linux(静态链接)
cargo build --release --target x86_64-unknown-linux-musl

使用 cross 工具

cross 使用 Docker 自动处理交叉编译所需的工具链:

cargo install cross

# 一键交叉编译(自动拉取 Docker 镜像)
cross build --release --target aarch64-unknown-linux-gnu
cross build --release --target x86_64-pc-windows-gnu

常见问题与解决

问题原因解决
链接错误缺少目标平台的链接器安装交叉编译工具链或用 cross
OpenSSL 编译失败依赖 C 库rustls 替代 OpenSSL
动态链接 glibc目标 glibc 版本不匹配使用 musl 静态链接
C 依赖编译失败缺少目标平台的 C 编译器cross 或安装对应的 gcc

静态链接(musl)

# musl 产生完全静态链接的二进制
# 可在任何 Linux 上运行,无需安装依赖
cargo build --release --target x86_64-unknown-linux-musl

CI 多平台构建

.github/workflows/release.yml
jobs:
build:
strategy:
matrix:
include:
- target: x86_64-unknown-linux-musl
os: ubuntu-latest
- target: aarch64-apple-darwin
os: macos-latest
- target: x86_64-pc-windows-msvc
os: windows-latest
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- run: cargo build --release --target ${{ matrix.target }}

常见面试问题

Q1: 交叉编译最大的挑战是什么?

答案

C 依赖。纯 Rust 项目交叉编译很简单,但依赖 C 库(OpenSSL、zlib、SQLite 等)时需要目标平台的 C 编译器和库文件。

最佳实践:

  1. 尽量用纯 Rust 替代品(rustlsflate2 纯 Rust backend)
  2. 使用 cross 工具(Docker 环境自带工具链)
  3. 生产用 musl 静态链接

相关链接