跳到内容
GitHub 仓库 论坛 RSS 新闻提要

Crystal 1.9 中的 Windows 支持

HertzDevil

随着 Crystal 1.9 的发布,编译器和标准库在使用 MSVC 工具链对 x64 Windows 提供一级支持方面迈出了重大一步。虽然官方的 Windows 版本尚未发布,但只剩下少数未解决的问题,预计将在未来几个月内解决。这篇文章简要概述了 1.9 所取得的成就 以及还需要实现的目标。

GUI 安装程序

installer

这是 Windows 上首次出现 GUI 安装程序!它安装了编译器和标准库的所有第三方依赖项。它还将编译器添加到 PATH 环境变量中,设置文件关联,正确更新或卸载,并在无法检测到 Windows SDK 或 Microsoft Visual Studio 时向用户发出警告。除了安装这些 Microsoft 组件之外,此设置预计在新的机器上能够“正常”工作。它为不熟悉命令行环境的 Windows 上的 Crystal 用户提供更简化的体验。

即将发布的 1.9 版本将提供此 GUI 安装程序的下载选项。每当有次要版本或补丁版本可用时,都会在 GitHub Actions 上构建新的安装程序,因此您通常不会看到 nightly 版本的安装程序(如上面的屏幕截图所示),尽管从 nightly 版本更新到或从 nightly 版本更新不应该有任何区别。如果您有 GitHub 帐户,请尝试使用 crystal-installer 来自此 CI 运行的工件 并报告您发现的任何问题。您也可以尝试在本地构建安装程序,使用 Inno Setup 并遵循 Windows 工作流程说明。

动态链接

在过去三个月中,大量工作都集中在尽可能无缝地支持 Windows 上的加载时动态链接。您现在可以使用 -Dpreview_dll 编译时标志选择加入实验性动态链接支持。更多详细信息可以在参考手册中找到 (1.9master)。简要概述如下

  • @[Link("foo")] 现在将指示编译器在静态链接时搜索 foo-static.lib,然后再搜索 foo.lib;在动态链接时,将搜索 foo-dynamic.lib,然后再搜索 foo.lib,从而允许两个库在同一个目录中并行使用。
  • 静态链接意味着 /MT,而动态链接意味着 /MD。您自己的 C 库应该使用适当的 MSVC 链接器标志进行构建。
  • 如果提供了编译器标志 -Dpreview_win32_delay_load,则可以使用 CRYSTAL_LIBRARY_RPATH 构建时环境变量将 DLL 搜索路径添加到默认搜索顺序之前。它的灵感来自 ELF 二进制文件的 DT_RPATH,同样也支持 $ORIGIN,从而使可重定位的动态链接的 Windows 二进制文件成为可能。

静态链接将仍然是 Crystal 1.9 和 1.10 上 Windows 的默认链接模式;编译器标志 -Dpreview_dll 在这些版本中启用动态链接。此后,动态链接将成为默认设置,而 --static 将用于静态链接,就像在其他系统上一样。如果您的构建脚本依赖于此,请相应地在脚本中添加 --static

其他值得注意的进步

  • IO.pipe 现在是异步的 (#13362)。这在 Windows 上的一些关键功能中实现了并发,最显著的是将 Process 的流管道到 IO,以及异步 Log 后端。请注意,目前 File 和标准流(如 STDOUT)仍然是同步的。
  • timeout 现在在 select 表达式中可以正常工作 (#13525)。
  • Time::Location 现在默认情况下支持 IANA 时区名称 (#13517),以及没有夏令时转换的本地时区 (#13516)。
  • STDINSTDOUTSTDERR 现在以二进制模式打开,而不是文本模式 (#13397)。这对于宏 run 处理包含 CRLF 行结束符的某些源文件是必要的。
  • Unix 套接字现在已得到支持,其程度与 Windows 实际实现的程度相同 (#13493),以及其他一些杂项套接字 API (#13325#13326#13363#13364)。
  • 现在可以正确删除只读文件和目录 (#13462#13626)。

剩下的

Windows 上不断变化的未解决问题清单可以在 这个 GitHub 项目 中找到,我们希望在官方 Windows 版本发布之前消除“待办事项”和“正在进行”列。截至撰写本文时,主要剩余问题是

  • Process.new(shell: true) 的行为 (#9030)
  • 支持文件 API 中的长路径 (#13420)
  • 与平台无关的浮点数 sprintf (#12473)
  • 使 /SUBSYSTEM:WINDOWS 更易于使用 (#13058#13330)
  • Process#closeProcess.run 中 (#13425)
  • crystal play (#13492) 和 crystal i (#12396)
  • -Dpreview_mt 下,通道的行为不正常

标准库测试套件中使用 pending_win32 标记的规范数量从上一次次要版本发布时的 35 个减少到了 8 个。这表明进展迅速,并将延续到下一个开发周期。