Go Wiki: 在 Linux 上构建 Windows Go 程序

参见 此处 获取可用的 GOOSGOARCH 值。

Go 版本 >= 1.5

自 Go 版本 1.5 以来,纯 Go 可执行文件的交叉编译变得非常容易。使用以下代码试用。您可以在 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

为了构建 Windows/386 版本的 Go 命令和包。您可能从我的脚本中看出,我排除了对任何与 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 的一部分。