如何编译能在 Windows XP 上运行的 Rust 程序

Rust 1.51.0 已经移除对 XP 支持 master (#81250) - 20230505,但是依然有方法编译 XP 程序。思路是,使用 YY-Thunks 来弥补 XP 没有的 API。值得注意的是,Rust 对 XP 的支持是 Tier3 级别,编译出来的程序并不保证可以正常运行,详见 Platform Support - 20230505

在阅读本文前,您可能需要知道:

  1. Powershell 如何添加环境变量,查看 Microsoft Learn - 20230505
  2. Rustc 如何添加链接器(linker)参数,参考 知乎上洛佳的专栏 - 20230505
  3. Rust 如何添加 32 位工具链,查看 Cross-compilation - 20230505

为 Windows XP 编译 Rust 程序的关键在于链接「YY_Thunks_for_WinXP.obj」这个文件。使用 Powershell 打开 Cargo 项目所在目录,输入如下指令即可完成操作:

$env:RUSTFLAGS="-Ctarget-feature=+crt-static -Clink-args=/subsystem:console,5.01 -Clink-args=oldnames.lib -Clink-args=path_to/YY_Thunks_for_WinXP.obj"
cargo run --release --target=i686-pc-windows-msvc

后记:Windows XP 早在 2014 年 4 月 8 日就已停止支持,很多软件和类库都不再支持 Windows XP,继续支持 Windows XP 将付出额外的成本。如果是出于爱好,想要开发出支持 XP 的程序,不妨尝试 C# 7.3 (.NET Framework)。如今,就连 .NET 也开源了,放在 10 年前是想都不敢想的,是时候 MOVE ON 了!

20230427 增加

对于最新版的 Rust 1.69.0,生成的程序必定调用「MSVC.dll」中的「__CxxFrameHandler3」,这导致即使链接 YY-Thunks,也不能让程序在 Windows XP 上运行。好在可以通过链接 VC-LTL5 运行时来修正这个问题,相关的命令行改成下面这样:

命令行参数

$env:RUSTFLAGS="-L path_to_vc_ltl5/TargetPlatform/5.1.2600.0/lib/Win32 -Clink-args=/subsystem:console,5.01 -Clink-args=oldnames.lib -Clink-args=path_to/YY_Thunks_for_WinXP.obj"
cargo run --release --target=i686-pc-windows-msvc

为了方便有这部分需求的读者,我写了一个小程序,叫做「Thunk」,通过执行该程序,便可一步到位生成可以在 Windows XP 或者 Windows Vista 上运行的 Rust 程序,详情可访问 felixmaker/thunk - Github - 20230505

  • 12
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值