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 的一部分。