Golang Linux、Windows、Mac 下交叉编译

前言

Golang 支持交叉编译, 即同一份代码,在一个平台上生成,然后可以在另外一个平台去执行。

之前写过一篇 Golang windows下 交叉编译 感觉写的不够全面,这篇作为补充。

交叉编译

Mac 上编译

# 生成编译文件,在 Linux 中运行CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go# 生成编译文件,在 Windows 中运行CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go

Linux 上编译

# 生成编译文件,在 Mac 中运行CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go# 生成编译文件,在 Windows 中运行CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go

Windows 上编译

Windows 中的 terminal 不支持 shell , 这和 MacLinux 有点不同,这时可以写一个批处理程序,在里面去设置

# 设置 Mac 编译环境SET CGO_ENABLED=0SET GOOS=darwinSET GOARCH=amd64go build main.go
# 设置 Linux 编译环境SET CGO_ENABLED=0SET GOOS=linuxSET GOARCH=amd64go build main.go

参数说明

  • CGO_ENABLED : CGO 表示golang中的工具,CGO_ENABLED 表示CGO禁用,交叉编译中不能使用CGO的
  • GOOS : 目标平台
    • mac 对应 darwin
    • linux 对应 linux
    • windows 对应 windows
    • freebsd 对应 freebsd类UNIX操作系统
  • GOARCH :目标平台的体系架构【386,amd64,arm】, 目前市面上的个人电脑一般都是amd64架构的
    • 386 也称 x86 对应 32位操作系统
    • amd64 也称 x64 对应 64位操作系统
    • arm 这种架构一般用于嵌入式开发。 比如 Android , IOS , Win mobile , TIZEN 等

示例

查看默认值

>#go envGOARCH="amd64"GOBIN=""GOCACHE="/root/.cache/go-build"GOEXE=""GOFLAGS=""GOHOSTARCH="amd64"GOHOSTOS="linux"GOOS="linux"GOPATH="/data/go"GOPROXY=""GORACE=""GOROOT="/usr/local/go"GOTMPDIR=""GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"GCCGO="gccgo"CC="gcc"CXX="g++"CGO_ENABLED="1"GOMOD=""CGO_CFLAGS="-g -O2"CGO_CPPFLAGS=""CGO_CXXFLAGS="-g -O2"CGO_FFLAGS="-g -O2"CGO_LDFLAGS="-g -O2"PKG_CONFIG="pkg-config"GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build171002917=/tmp/go-build -gno-record-gcc-switches">#

更改

>#CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go envGOARCH="amd64" # 变更了GOBIN=""GOCACHE="/root/.cache/go-build"GOEXE=".exe"GOFLAGS=""GOHOSTARCH="amd64"GOHOSTOS="linux"GOOS="windows" # 变更了GOPATH="/data/go"GOPROXY=""GORACE=""GOROOT="/usr/local/go"GOTMPDIR=""GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"GCCGO="gccgo"CC="gcc"CXX="g++"CGO_ENABLED="0" # 变更了GOMOD=""CGO_CFLAGS="-g -O2"CGO_CPPFLAGS=""CGO_CXXFLAGS="-g -O2"CGO_FFLAGS="-g -O2"CGO_LDFLAGS="-g -O2"PKG_CONFIG="pkg-config"GOGCCFLAGS="-m64 -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build668031908=/tmp/go-build -gno-record-gcc-switches">#

查看更改后的值

>#go envGOARCH="amd64" # 还原了GOBIN=""GOCACHE="/root/.cache/go-build"GOEXE=""GOFLAGS=""GOHOSTARCH="amd64"GOHOSTOS="linux"GOOS="linux" # 默认值GOPATH="/data/go"GOPROXY=""GORACE=""GOROOT="/usr/local/go"GOTMPDIR=""GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"GCCGO="gccgo"CC="gcc"CXX="g++"CGO_ENABLED="1"GOMOD=""CGO_CFLAGS="-g -O2"CGO_CPPFLAGS=""CGO_CXXFLAGS="-g -O2"CGO_FFLAGS="-g -O2"CGO_LDFLAGS="-g -O2"PKG_CONFIG="pkg-config"GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build240557259=/tmp/go-build -gno-record-gcc-switches">#

相关文章