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=0
SET GOOS=darwin
SET GOARCH=amd64
go build main.go
# 设置 Linux 编译环境
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go 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 env
GOARCH="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 env
GOARCH="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 env
GOARCH="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"
>#

Golang Linux、Windows、Mac 下交叉编译

上一篇:C#常见的文件路径Api


下一篇:C# Body为form-data file文件上传至第三方接口