文章摘要
这篇文章介绍了作者如何让开源游戏Principia重新支持Windows XP系统。尽管现代工具链和依赖库已不再兼容XP,作者仍通过技术手段成功构建了可在XP上运行的游戏版本,实现了让这款2014年发布的游戏重回旧系统的目标。
文章总结
好的,这是根据您的要求,对原文主要内容进行的中文重述,已保留关键细节并删减了与主题无关的内容(如文末的捐赠呼吁)。
标题:为 Windows XP 编译 Principia
核心内容:
本文详细记录了作者将开源游戏《Principia》重新带回 Windows XP 系统的技术过程。
背景与挑战: 《Principia》最初于2014年发布时是支持 Windows XP 的。但如今,作为开源项目,其使用的现代工具链和依赖库(如 UCRT)已不再支持 XP。作者的目标是构建一个完全开源的、能在 XP 上运行的《Principia》版本。
技术细节: 《Principia》本身依赖很少,主要使用 SDL 库(仍支持 XP),且游戏对硬件要求不高(支持 OpenGL 2.0 即可)。主要障碍在于编译工具链和部分依赖库已不再兼容 XP。
构建工具链:
作者决定自行编译一套交叉编译工具链。他基于 Martin Storsjö 的 Dockerfile 编写了 shell 脚本,目标是 32 位 Windows(i686-w64-mingw32),使用 MSVCRT 运行时,并将默认目标系统设为 Windows XP(WIN32_WINNT=0x0501)。
编译过程遇到两个主要问题:
1. GMP 库与 GCC 16 的兼容性问题:最新的 GMP 库在 GCC 15+(默认 C23 标准)下编译失败。作者通过配置 GMP 使用 -std=gnu99 标准解决了此问题。
2. libstdc++ 对 Vista 的依赖:GCC 16 的 C++ 标准库中,std::chrono 功能硬性依赖 Vista 才有的 GetDynamicTimeZoneInformation 函数。作者从 w64devkit 项目中找到了一个补丁,将该依赖改为动态加载,若函数不存在则静默失败,从而解决了问题。
最终,作者成功构建了一套能生成 XP 可执行文件的工具链。
构建依赖库:
《Principia》需要 curl、Freetype、libjpeg-turbo、libpng、SDL 和 zlib 等外部库。其中,curl 在 8.18.0 版本中因使用了 XP 不存在的 freopen_s 函数而无法工作,作者最终选用了 8.17.0 版本。此外,作者决定暂时放弃构建庞大的 GTK3 依赖(用于桌面对话框),转而使用更轻量的 Dear Imgui 实现实验性对话框,尽管功能尚不完整。
编译与测试:
使用新工具链和依赖库,作者成功编译了《Principia》。编译过程中修复了一个与 __stdcall 调用约定相关的类型定义错误。在 Wine 中初步测试通过后,作者将程序转移到真实的 Windows XP 环境中测试。
在真实硬件上运行: 作者在一台旧电脑(AMD Phenom II X4 955)上安装了 Windows XP。安装过程颇具挑战,最终借助“Universal NT Installer”工具成功安装了支持 AHCI 的 XP 系统。之后,作者解决了网卡驱动、显卡驱动(ATI Radeon HD 3000)等问题,并安装了浏览器。
最终,作者成功在 XP 上启动了《Principia》,看到了主菜单。虽然由于显卡驱动问题,游戏字体显示异常(经确认,2014年的旧版《Principia》也存在同样问题,故非本次编译所致),但核心目标——让开源版《Principia》在 Windows XP 上运行——已经达成。
后续改进: 作者进一步优化了构建,将 curl 的 TLS 后端从 Schannel(因 XP 的 TLS 栈过旧)改为 mbedTLS,并捆绑了最新的 CA 证书库。他还制作了安装包,方便用户安装并注册协议处理器。
总结: 所有用于构建工具链、依赖库和《Principia》的脚本均已开源在 GitHub 仓库中,并发布了首个 XP 兼容版本。作者指出,这并非官方维护的版本,不会与官方版本同步更新。
评论总结
根据评论内容,主要观点和论据如下:
1. 对游戏《Principia》的惊喜与赞赏
- 评论1(zamadatix):“How on earth have I missed the existence of this physics game for the last 12 years!? It even has the option to play levels directly in the browser!”(我怎么会错过这个物理游戏12年!它甚至可以直接在浏览器中玩关卡。)
- 评论2(tribal808):“this is so cool... people like you are keeping the internet alive”(这太酷了……像你这样的人让互联网保持活力。)
2. 对在旧系统(如Windows XP)上运行软件的认可
- 评论3(accrual):“I admire those who make the effort to keep their software running on old unsupported OSs... It's one of the last great Windows versions”(我钦佩那些努力让软件在旧系统上运行的人……这是最后一个伟大的Windows版本之一。)
- 评论11(asveikau):“I found it was fairly easy to maintain a binary that loaded on WinXP using VS2015 as my compiler”(我发现用VS2015编译器维护一个能在WinXP上运行的二进制文件相当容易。)
3. 对技术细节的讨论与疑问
- 评论7(NooneAtAll3):“but what IS principia?”(但Principia到底是什么?)
- 评论10(Borg3):“on github page I read its experimental and lots of dialogs arent implemented... Maybe I will take a bite and try to build it”(在GitHub页面上我看到它是实验性的,很多对话框未实现……也许我会尝试构建它。)
4. 对相关工具和资源的推荐
- 评论5(haunter):“Legacy Update basically solves every post install update/driver issues”(Legacy Update基本解决了安装后的所有更新/驱动问题。)
- 评论8(Aerocatia):“if you have the MSVC redistributable 14.27.29114 you can use UCRT executables built with modern Mingw-W64 on Windows XP”(如果你有MSVC可再发行组件14.27.29114,可以在Windows XP上使用现代Mingw-W64构建的UCRT可执行文件。)
5. 对标题的误解与期待
- 评论12(Torwald):“Judging from the headline I thought this was a design doc for a OSS clone of WinXP, which would be a cool thing IMHO”(从标题看,我以为这是WinXP开源克隆的设计文档,我觉得那会很酷。)
总结:评论整体对《Principia》游戏及其在旧系统上的运行表示高度认可,同时讨论了技术实现细节、工具推荐和标题误解。观点平衡,既有对游戏本身的惊喜,也有对技术挑战的理性分析。