我们平时的开发环境和真正要部署的环境经常会遇到要不一样的情况,前面说的环境主要是指CPU的架构和操作系统,例如在X86的平台上编译的可执行文件在ARM平台上是不能运行的,反之亦然。这时候就需要交叉编译,交叉编译是在一个平台上生成另一个平台上的可执行文件。Golang 支持交叉编译,而且提供了非常方便的交叉编译方式。
Go交叉编译,主要涉及到以下几个环境变量的设置: GOARCH、GOOS和CGO_ENABLED。
GOARCH:编译目标平台的硬件体系架构(amd64, 386, arm, ppc64等)。
GOOS:编译目标平台上的操作系统(darwin, freebsd, linux, windows)。
CGO_ENABLED:代表是否开启CGO,1表示开启,0表示禁用。由于CGO不能支持交叉编译,所以需要禁用。
具体的说明可通过输入命令go help environment查看 :
$ go help environment
...
GOARCH
The architecture, or processor, for which to compile code.
Examples are amd64, 386, arm, ppc64.
...
GOOS
The operating system for which to compile code.
Examples are linux, darwin, windows, netbsd.
...
CGO_ENABLED
Whether the cgo command is supported. Either 0 or 1.
编译 Linux 64位可执行程序:
# X86
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
# ARM
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build main.go
编译Windows 64位可执行程序:
# X86
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
# ARM
CGO_ENABLED=0 GOOS=windows GOARCH=arm64 go build main.go
编译 MacOS 64位可执行程序
# X86
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go
# ARM
CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build main.go