我們平時的開發(fā)環(huán)境和真正要部署的環(huán)境經(jīng)常會遇到要不一樣的情況,前面說的環(huán)境主要是指CPU的架構(gòu)和操作系統(tǒng),例如在X86的平臺上編譯的可執(zhí)行文件在ARM平臺上是不能運行的,反之亦然。這時候就需要交叉編譯,交叉編譯是在一個平臺上生成另一個平臺上的可執(zhí)行文件。Golang 支持交叉編譯,而且提供了非常方便的交叉編譯方式。
Go交叉編譯,主要涉及到以下幾個環(huán)境變量的設(shè)置: GOARCH、GOOS和CGO_ENABLED。
GOARCH:編譯目標平臺的硬件體系架構(gòu)(amd64, 386, arm, ppc64等)。
GOOS:編譯目標平臺上的操作系統(tǒng)(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位可執(zhí)行程序:
# 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位可執(zhí)行程序:
# 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位可執(zhí)行程序
# X86
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go
# ARM
CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build main.go