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 上建立新的安裝程式,因此您通常不會看到像上面螢幕截圖那樣的每日建置安裝程式,儘管更新到或從每日版本更新應該沒有任何不同。如果您有 GitHub 帳戶,請嘗試從此 CI 執行中取得 crystal-installer
構件,並回報您發現的任何問題。您也可以嘗試使用 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)。
剩下什麼
可以在 這個 GitHub 專案中找到 Windows 上不斷變化的未解決問題清單,我們希望在正式 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 個。這是快速進展的跡象,這種進展將延續到下一個開發週期。