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



安裝與設定MSYS2

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

https://magiclen.org/msys2/

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

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

首先在MSYS2的終端機上執行以下指令:

curl https://sh.rustup.rs -sSf | sh

安裝程式可能會提示說需要微軟的Visual C++ Build Tools。不要理它,輸入「y」繼續。

rust-msys2

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

rust-msys2

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

rust-msys2

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

rust-msys2

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

rust-msys2

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

rust-msys2

rust-msys2

rust-msys2

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

rust-msys2

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

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

rust-msys2

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

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的終端機中使用「rustup」和「cargo」等Rust開發環境的相關指令了!

rust-msys2

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使用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」目標來編譯程式時,就會去用MinGW提供的「gcc.exe」和「ar.exe」來做函式庫的連結。

Rust與MSYS2的Hello World

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

cargo new --bin hello

cd hello

cargo run

rust-msys2