在預設情況下,Windows 版本的 rustc 編譯出來的 Win32/Win64 執行檔,會需要一些 Visual C++ 的 DLL 才能執行。對於軟體開發人員來說,在建構開發環境的過程中,這些 DLL 都會被安裝到系統之中,因此不太會遇到編譯出來的執行檔無法執行的問題;但若是我們要將執行檔給別人、在沒有安裝開發環境的電腦上執行,往往就會遇到問題。

我們可以利用 Visual Studio 所內建的工具程式 dumpbin(加上參數 /dependents)來檢查執行檔的 DLL 依存關係:

上面列出來的 DLL 中,KERNEL32.DLLbcrypt.dll 是 Windows 內建的 DLL,其他的都是 Visual C++ 提供的 DLL,不見得每一台 PC 上都會有這些 DLL。

如果希望 rustc 採用靜態連結的方式、移除對 VC++ DLL 的依存性,可以在 Rust 專案中的 .cargo\config 檔案中,加上這兩行:

[target.x86_64-pc-windows-msvc]
rustflags = ["-C", "target-feature=+crt-static"]

然後重新編譯程式。這樣就可以了:

  • 資料來源:https://stackoverflow.com/questions/31770604/how-to-generate-statically-linked-executables

By closer

發表迴響