Go Wiki: 在 Linux 上构建 Windows Go 程序
参见 此处 获取可用的 GOOS
和 GOARCH
值。
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-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
为了构建 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 的一部分。