1. 准备Debian系统的基础环境
在Debian上安装Rust官方工具链管理器rustup
,用于管理Rust版本和跨平台工具链:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env # 加载环境变量
验证安装:
rustc --version # 检查Rust编译器版本
cargo --version # 检查Cargo包管理器版本
rustup --version # 检查rustup工具版本
2. 安装跨平台目标工具链
使用rustup
添加需要编译的目标平台(三元组格式:arch-vendor-os
)。例如:
x86_64-pc-windows-gnu
(GNU工具链,依赖MinGW)、x86_64-pc-windows-msvc
(MSVC工具链,需Visual Studio或Windows SDK);x86_64-apple-darwin
(Intel架构)、aarch64-apple-darwin
(Apple Silicon架构);x86_64-unknown-linux-gnu
(动态链接)、x86_64-unknown-linux-musl
(静态链接,无系统依赖)。rustup target add x86_64-pc-windows-gnu # 示例:添加Windows GNU工具链
rustup target add x86_64-apple-darwin # 示例:添加macOS工具链
rustup target add x86_64-unknown-linux-musl # 示例:添加Linux静态链接工具链
3. 配置目标平台的链接器(可选但关键)
若目标平台需要特定链接器(如Windows的MinGW、Linux的musl),需安装对应工具链并在~/.cargo/config.toml
中配置:
[target.x86_64-pc-windows-gnu]
linker = "x86_64-w64-mingw32-gcc" # MinGW链接器
ar = "x86_64-w64-mingw32-ar" # MinGW归档工具
[target.x86_64-unknown-linux-musl]
linker = "x86_64-linux-musl-gcc" # musl链接器
安装链接器工具链(以Debian为例):
sudo apt install gcc-mingw-w64-x86-64 # Windows MinGW
wget https://musl.cc/x86_64-linux-musl-cross.tgz # Linux musl
tar -zxf x86_64-linux-musl-cross.tgz -C /usr/local
4. 处理平台特定代码
使用Rust的#[cfg]
属性处理不同平台的逻辑差异,例如:
#[cfg(target_os = "windows")]
fn open_file() {
println!("Using Windows file API...");
}
#[cfg(target_os = "linux")]
fn open_file() {
println!("Using Linux file API...");
}
#[cfg(target_os = "macos")]
fn open_file() {
println!("Using macOS file API...");
}
fn main() {
open_file(); // 根据目标平台调用对应函数
}
或在Cargo.toml
中指定平台依赖:
[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3", features = ["fileapi", "handleapi"] }
[target.'cfg(unix)'.dependencies]
libc = "0.2"
5. 编译跨平台项目
使用cargo build
命令指定目标平台,生成对应平台的可执行文件:
cargo build --target x86_64-pc-windows-gnu --release # 编译Windows版本
cargo build --target x86_64-apple-darwin --release # 编译macOS版本
cargo build --target x86_64-unknown-linux-musl --release # 编译Linux静态版本
生成的可执行文件位于target/<target-triple>/release/
目录下。
6. 使用工具简化跨平台编译
cross
工具:封装了交叉编译的复杂配置(如自动下载目标工具链、处理依赖),简化编译流程:cargo install cross # 安装cross工具
cross build --target x86_64-pc-windows-gnu --release # 一键编译Windows版本
FROM rust:latest
RUN rustup target add x86_64-pc-windows-gnu
RUN apt-get update && apt-get install -y mingw-w64
WORKDIR /app
COPY . .
CMD ["cargo", "build", "--target", "x86_64-pc-windows-gnu", "--release"]
构建并运行容器:docker build -t rust-cross .
docker run --rm -v $(pwd):/app rust-cross
7. 测试与调试跨平台应用
wine target/x86_64-pc-windows-gnu/release/my_app.exe # 测试Windows应用
name: Cross Platform Build
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
target: ["x86_64-pc-windows-gnu", "x86_64-apple-darwin", "x86_64-unknown-linux-musl"]
steps:
- uses: actions/checkout@v3
- uses: actions-rs/toolchain@v1
with:
toolchain: stable
target: ${{ matrix.target }}
override: true
- name: Build
run: cargo build --target ${{ matrix.target }} --release
- name: Upload Artifact
uses: actions/upload-artifact@v3
with:
name: my-app-${{ matrix.target }}
path: target/${{ matrix.target }}/release/my_app*
8. 常见问题解决
mingw-w64
、musl
),并在config.toml
中正确配置;openssl
替换为rustls
),或为目标平台交叉编译系统库;std::path::Path
或path_slash
crate处理跨平台路径:use std::path::Path;
let config_path = Path::new("data").join("config.toml"); // 自动适配路径分隔符