TrumanWong

Golang交叉编译

TrumanWong
12/8/2021

什么是交叉编译

交叉编译是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。

Golang中使用交叉编译

Golang支持交叉编译,可以编译出在不同系统和CPU架构运行的二进制文件。

# 编译目标平台Linux64位
$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go

# 编译目标平台Windows 64位
$ CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go

# 编译目标平台Mac 64位
$ CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go

参数说明:

  • CGO_ENABLED: CGO 表示golang中的工具,CGO_ENABLED 表示CGO禁用,交叉编译中不能使用CGO的
  • GOOS: 目标平台
    • Mac对应darwin
    • Linux对应linux
    • Windows对应windows
  • GOARCH: 目标平台的体系架构,常用的有386amd64arm等。
    • 386也称x86对应32位操作系统
    • amd64也称x64对应64位操作系统
    • arm这种架构一般用于嵌入式开发,比如Android、IOS等。

我们可以通过go tool dist list 命令查看go支持的的$GOOS$GOARCH值:

$ go tool dist list
aix/ppc64
android/386
android/amd64
android/arm
android/arm64
darwin/amd64
darwin/arm64
dragonfly/amd64
freebsd/386
freebsd/amd64
freebsd/arm
freebsd/arm64
illumos/amd64
ios/amd64
ios/arm64
js/wasm
linux/386
linux/amd64
linux/arm
linux/arm64
linux/mips
linux/mips64
linux/mips64le
linux/mipsle
linux/ppc64
linux/ppc64le
linux/riscv64
linux/s390x
netbsd/386
netbsd/amd64
netbsd/arm
netbsd/arm64
openbsd/386
openbsd/amd64
openbsd/arm
openbsd/arm64
openbsd/mips64
plan9/386
plan9/amd64
plan9/arm
solaris/amd64
windows/386
windows/amd64
windows/arm
windows/arm64

也可以通过go env GOOS GOARCH命令查看系统当前的$GOOS$GOARCH

$ go env GOOS GOARCH
windows
amd64