Crystal 1.9 中的 Windows 支持
随着 Crystal 1.9 的发布,编译器和标准库在使用 MSVC 工具链对 x64 Windows 提供一级支持方面迈出了重大一步。虽然官方的 Windows 版本尚未发布,但只剩下少数未解决的问题,预计将在未来几个月内解决。这篇文章简要概述了 1.9 所取得的成就 以及还需要实现的目标。
GUI 安装程序
这是 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.9,master)。简要概述如下
@[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)。STDIN
、STDOUT
和STDERR
现在以二进制模式打开,而不是文本模式 (#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#close
在Process.run
中 (#13425)crystal play
(#13492) 和crystal i
(#12396)- 在
-Dpreview_mt
下,通道的行为不正常
标准库测试套件中使用 pending_win32
标记的规范数量从上一次次要版本发布时的 35 个减少到了 8 个。这表明进展迅速,并将延续到下一个开发周期。