编译问题:rust交叉编译注意事项
起因是工作上生产环境为win7,比较老的版本,而开发机器是win11,因此,要想在win11上开发win7的应用需要注意一些事情。
rustup
版本
rust工具链版本适用于不同的系统版本,是因为操作系统提供的API在不断升级,rust核心库支持的API也会随之升级。 例如,rust 1.75是最后一个支持Windows7,windows8的版本
也就是说,想要开发运行在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 Studio | visual studio |
x86_64-pc-windows-gnu | GNU(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-gnu | glibc | ❌ 动态链接 | ⛔ 否(受限于 glibc 版本) | ✅ 需要目标系统有相同或兼容 glibc | 较小 | 默认构建,开发时用 |
x86_64-unknown-linux-musl | musl libc | ✅ 静态链接 | ✅ 是(跨发行版运行) | ❌ 不依赖系统 libc 环境 | 稍大 | 静态发布,跨平台运行 |
注意:x86_64-unknown-linux-musl平台位于rust支持的第二级目标平台,也就是说rust保证构建,但是不保证可以正常运行。
crate包
某些crate包依赖于较新的系统API,可能导致编译失败或运行失败,开发时要注意。
编译过程
- 不需要安装本地链接器:
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
兼容性 为了更好的向下兼容系统,对应当前项目的配置,需在当前工程的目录创建${PRJ_DIR}/.cargo/config.toml并修改:
//以兼容win7为例
rustflags = ["-C", "link-args=-Wl,--subsystem,console,6.01"]