wakamda's blog
Code,Think,Create
推送于 | Tags:

编译问题:rust交叉编译注意事项

起因是工作上生产环境为win7,比较老的版本,而开发机器是win11,因此,要想在win11上开发win7的应用需要注意一些事情。

rustup

版本

rust工具链版本适用于不同的系统版本,是因为操作系统提供的API在不断升级,rust核心库支持的API也会随之升级。 例如,rust 1.75是最后一个支持Windows7,windows8的版本

rust1.75

也就是说,想要开发运行在win7上的rust应用,rust编译链(cargo)最高版本为1.75

平台(可选,更方便)

假如执行 'rustup install 1.75.0' ,触发的是下载默认当前平台的工具链(MSVC),而不是目标平台的(GNU),当需要交叉编译时,可以显式指定这样更方便,例如:

rustup install 1.75.0-x86_64-pc-windows-gnu

此时,工具链包含了所有目标平台的编译相关组件。

也可以在后面通过指定目标平台,达到同样的效果。

目标平台

和linux中的交叉编译类似,使用rust编译不同目标操作系统的代码时,需要指定并设置编译链。

Rust 在 Windows 上有两个主要目标:

Target Triple使用的工具链特点安装
x86_64-pc-windows-msvc微软官方 MSVC默认推荐,兼容 Visual Studiovisual studio
x86_64-pc-windows-gnuGNU(MinGW-w64)不依赖 MSVC,更开放但兼容性略差https://www.msys2.org/

其他所有rust支持的目标平台: https://doc.rust-lang.net.cn/1.85.0/rustc/platform-support.html#platform-support

例1:需要安装链接器

在window11上编译win7的程序时,由于win11使用的是MSVC,所以必须额外下载GNU工具链以适配win7。

//完整流程(需要本地安装GNU链接器并设置环境变量)

rustup install 1.75.0
rustup target add x86_64-pc-windows-gnu --toolchain 1.75.0
rustup show
cargo build --release --target x86_64-pc-windows-gnu

例2

使用ubuntu20开发其它linux平台(64位)的程序时,由于目标GLIBC版本太低导致无法运行,所以应该使用x86_64-unknown-linux-musl工具链。

rustup target add x86_64-unknown-linux-musl
apt-get install musl-tools
cargo build --release --target x86_64-unknown-linux-musl
目标平台libc 实现是否静态链接是否可移植是否需要系统依赖文件体积常用场景
x86_64-unknown-linux-gnuglibc❌ 动态链接⛔ 否(受限于 glibc 版本)✅ 需要目标系统有相同或兼容 glibc较小默认构建,开发时用
x86_64-unknown-linux-muslmusl libc✅ 静态链接✅ 是(跨发行版运行)❌ 不依赖系统 libc 环境稍大静态发布,跨平台运行

注意:x86_64-unknown-linux-musl平台位于rust支持的第二级目标平台,也就是说rust保证构建,但是不保证可以正常运行。

crate包

某些crate包依赖于较新的系统API,可能导致编译失败或运行失败,开发时要注意。

编译过程

  1. 不需要安装本地链接器:
rustup toolchain list
rustup toolchain uninstall <version>//删除某个版本

//下载对应rust版本(注意兼容性)
rustup install 1.75.0-x86_64-pc-windows-gnu
rustup override set 1.75.0-x86_64-pc-windows-gnu
  1. 需要安装本地链接器:见例1

  2. 兼容性 为了更好的向下兼容系统,对应当前项目的配置,需在当前工程的目录创建${PRJ_DIR}/.cargo/config.toml并修改:

//以兼容win7为例
rustflags = ["-C", "link-args=-Wl,--subsystem,console,6.01"]

Copyright 2025 wakamda