交叉编译问题
问题
如何将 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 编译器和库文件。
最佳实践:
- 尽量用纯 Rust 替代品(
rustls、flate2纯 Rust backend) - 使用
cross工具(Docker 环境自带工具链) - 生产用 musl 静态链接