Go Wiki: 在 Linux 上構建 Windows Go 程式
有關可用的 GOOS 和 GOARCH 值,請參見此處。
Go 版本 >= 1.5
自 Go 1.5 版本以來,純 Go 可執行檔案的交叉編譯變得非常容易。嘗試使用下面的程式碼。有關更多資訊,請參閱 Dave Cheney 的這篇部落格文章:Dave Cheney。
$ cat hello.go
package main
import "fmt"
func main() {
fmt.Printf("Hello\n")
}
$ GOOS=windows GOARCH=386 go build -o hello.exe hello.go
在 cmd.exe 中而不是 PowerShell 中
$ set GOOS=windows
$ set GOARCH=386
$ go build -o hello.exe hello.go
您現在可以在您附近的 Windows 計算機上執行 hello.exe。
請注意,第一次執行上述命令時,它將默默地重新構建大部分標準庫,因此會比較慢。由於 Go 命令的構建快取,後續的構建會更快。
另外請注意,在交叉編譯時 cgo 是停用的,因此任何提及 import "C" 的檔案都將被默默忽略(請參見 https://github.com/golang/go/issues/24068)。要使用 cgo 或任何構建模式 c-archive、c-shared、shared、plugin,您需要有一個 C 交叉編譯器。
舊版 Go 版本(<1.5)
我使用 linux/386,但我懷疑此過程也適用於其他主機平臺。
準備工作(如果需要)
sudo apt-get install gcc
export go env GOROOT
第一步是構建主機的 Go 版本
cd $GOROOT/src
sudo -E GOOS=windows GOARCH=386 PATH=$PATH ./make.bash
接下來,您需要構建其餘的 Go 編譯器和連結器。我有一個小程式來完成這項工作
$ cat ~/bin/buildcmd
#!/bin/sh
set -e
for arch in 8 6; do
for cmd in a c g l; do
go tool dist install -v cmd/$arch$cmd
done
done
exit 0
最後一步是構建 Windows 版本的所有標準命令和庫。我也有一個小型指令碼來完成這項工作
$ cat ~/bin/buildpkg
#!/bin/sh
if [ -z "$1" ]; then
echo 'GOOS is not specified' 1>&2
exit 2
else
export GOOS=$1
if [ "$GOOS" = "windows" ]; then
export CGO_ENABLED=0
fi
fi
shift
if [ -n "$1" ]; then
export GOARCH=$1
fi
cd $GOROOT/src
go tool dist install -v pkg/runtime
go install -v -a std
我是這樣執行的
$ ~/bin/buildpkg windows 386
來構建 Go 命令和包的 Windows/386 版本。您可能從我的指令碼中看到,我排除了構建任何與 cgo 相關的部分——這些對我來說將不起作用,因為我沒有安裝相應的 gcc 交叉編譯工具。所以我只是跳過了它們。
現在我們準備構建我們的 Windows 可執行檔案
$ cat hello.go
package main
import "fmt"
func main() {
fmt.Printf("Hello\n")
}
$ GOOS=windows GOARCH=386 go build -o hello.exe hello.go
我們只需要找到一臺 Windows 計算機來執行我們的 hello.exe。
此內容是 Go Wiki 的一部分。