Go 本身就是一個跨平台的程式語言,所以將專案編譯成其他作業系統能夠執行的檔案也是有支援的,今天就來筆記一下,如何在 Windows 作業系統編譯 Mac 的執行檔案。

說明

在執行 go build . 的時候,會讀取讀 GO 的環境變數 GOOSGOARCH 來決定要產生什麼樣平台的執行檔案。 如下圖所示,我執行 go env 來查看環境變數, 可以看到 GOARCH=amd64,GOOS=windows,這表示我執行 go build . 的時候會產生 windows 64位元 作業系統的執行檔案。

go-envgo-env

產生其他作業系統的執行檔

我這邊會以在 windows 作業系統上,產生 macOS 執行檔為範例。 根據 Cross compile Go on OSX? 此篇的說明,要編譯成 macOS 的話,要設定 GOOS=linux, GOARCH=arm64,請參考下方暫時性調整 GO 環境變數的方式產生 macOS 的執行檔。

bash
  • bash
1
$ SET GOOS=linux&SET GOARCH=arm64&go build .

產生結果如下圖:

macOS-buildmacOS-build

使用 $ SET GOOS=linux 的方式不會真的寫回 GO 環境變數,關掉 cmd 後此設定就會消失,如果真的要長久調整 GO 環境變數的話,需使用 $ go env -w GOOS=linux 的方式才可以。

GOOS, GOARCH 參考列表 => Optional environment variables

cmd/go: unsupported GOOS/GOARCH pair windows/arm64

我在使用 $ go env -w GOOS=linux 寫環境變數的時候,不小心造成 cmd/go: unsupported GOOS/GOARCH pair linux SET GOARCH=arm64/arm64 錯誤,我只要使用 $ go env 命令就會出現錯誤,導致我無法把環境變數改回來,錯誤圖如下:

unsupported-pair-errorunsupported-pair-error

而這個原因是 GOOS, GOARCH 沒有匹配造成的。 匹配列表請參考 Optional environment variables

處理方法很簡單,先用 $ SET 方式把環境變數設定好,再使用 $ go env -w 的方式寫回去就可以了,如下方以我 windows 環境為範例,解決匹配錯誤的指令。

bash
  • bash
1
2
3
4
$ set GOOS=windows
$ set GOARCH=amd64
$ go env -w GOOS=windows
$ go env -w GOARCH=amd64

延伸閱讀

[Cross compilation with Go 1.5]
[Building GoLang Package for Linux (or any) from Windows]
[SettingGOPATH]
[Optional environment variables for $GOOS and $GOARCH]
[Setting environment variables for Windows cmd temporarily, to run a program, in a single line?]