Windows作業系統中的Rust程式,預設會使用MSVC來編譯的。但是如果Rust程式有使用到GNU相關的函式庫(例如GTK)時,就得搭配MinGW來編譯了。MSYS2是一套整合MinGW和POSIX環境的工具,可以在Windows作業系統上模擬出Linux作業系統的開發環境,且能利用MinGW直接編譯出在Windows作業系統上執行的程式。



安裝與設定MSYS2

參考這篇文章來安裝與設定MSYS2:

在Windows作業系統安裝Rust開發環境

如果您的Windows作業系統已經有Rust的開發環境(在命令提示字元下可以直接使用rustupcargo等指令),可以跳過這個部份。

首先在MSYS2的終端機上執行以下指令來用rustup安裝Rust的開發工具:

curl -fsSL https://sh.rustup.rs | sh -s

安裝檔可能會提示說需要微軟的Visual C++ Build Tools。這時選擇第三個選項不讓rustup幫我們自動安裝這些微軟的東西。

rust-msys2

選擇第二個選項來自訂Rust要如何安裝。

rust-msys2

host triple的部份,輸入x86_64-pc-windows-gnu,也就是我們的Rust編譯器預設使用的目標(target)名稱。

rust-msys2

接著輸入Rust的版本,建議直接按下Enter使用stable,如果有nightly需求的話就輸入nightly吧!

rust-msys2

選擇要進行多完整的安裝,用預設即可。

rust-msys2

接著設定是否要修改PATH環境變數,輸入y

rust-msys2

然後回到選單,選擇第一項,開始用我們剛才的設定來安裝Rust。

rust-msys2

rust-msys2

rust-msys2

安裝好後,確認PATH環境變數是否有包含%USERPROFILE%\.cargo\bin路徑,沒有的話就加上去。

rust-msys2

在MSYS2的終端機中設定Rust開發環境

在命令提示字元中輸入rustupcargo指令來確認Windows作業系統的Rust開發環境是否安裝且設定成功。如果有設定成功,指令才會存在。

rust-msys2

確認好Windows作業系統已經正確地弄好Rust開發環境後,可以在MSYS2的終端機中,再執行rustupcargo指令。您可能會發現MSYS2的終端機並無法使用rustupcargo指令。

rust-msys2

此時可以在MSYS2的終端機中利用以下指令來查看PATH環境變數:

echo $PATH

rust-msys2

如果沒看到PATH環境變數中有包含/c/Users/您的Windows使用者名稱/.cargo/bin的話,我們就得按照以下方法自行加進去。

利用vim等文字編輯軟體,開啟MSYS2的終端機家目錄中的.bashrc檔案。如果目前的工作目錄已經是家目錄了,指令如下:

vim .bashrc

rust-msys2

修改.bashrc的內容,將/c/Users/您的Windows使用者名稱/.cargo/bin加入至PATH環境變數中。如下圖:

rust-msys2

存檔後,在MSYS2的終端機的家目錄中執行以下指令,來套用修改後的「PATH」環境變數。

source .bashrc

rust-msys2

之後就可以在MSYS2的終端機中使用rustupcargo等Rust開發環境的相關指令了!

rust-msys2

替Rust加入x86_64-pc-windows-gnu目標

如果您在安裝Rust的時候已經設定使用了x86_64-pc-windows-gnu目標,可以跳過這個部份。

在MSYS2的終端機中使用以下指令,來查看Rust開發環境目前已加入的目標:

rustup toolchain list

rust-msys2

如果沒有看到x86_64-pc-windows-gnu目標的話,可以使用以下指令來安裝:

rustup target add x86_64-pc-windows-gnu

rust-msys2

讓Rust使用MSYS2的MinGW

當我們使用rustup安裝x86_64-pc-windows-gnu目標時,rustup會替我們加上rust-mingw這個元件,內有Rust自帶的MinGW工具鏈。若要替換成我們剛才使用MSYS2所安裝的MinGW工具鏈的話,可以在MSYS2的終端機中使用vim等文字編輯軟體,開啟/c/Users/您的Windows使用者名稱/.cargo/config檔案。

rust-msys2

在檔案內加上以下內容:

[target.x86_64-pc-windows-gnu]
linker = "C:\\msys64\\mingw64\\bin\\gcc.exe"
ar = "C:\\msys64\\mingw64\\bin\\ar.exe"

rust-msys2

如此一來,不論是哪個Cargo程式專案,在使用x86_64-pc-windows-gnu目標來編譯程式時,就會去用MSYS2的MinGW提供的gcc.exear.exe來做函式庫的連結。

Rust與MSYS2的Hello World

為了確定我們的Rust開發環境沒有問題,可以在MSYS2的終端機中,使用以下幾個指令來測試預設的Cargo程式專案(Hello World)是否可以正常被編譯執行。

cargo new --bin hello
cd hello
cargo run

rust-msys2