Go Wiki: 在 Linux 上構建 Windows Go 程式

有關可用的 GOOSGOARCH 值,請參見此處

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-archivec-sharedsharedplugin,您需要有一個 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 的一部分。