前言
Golang 支持交叉编译, 在一个平台上生成然后再另外一个平台去执行。 而且编译的工具【build】这个工具是Golang 内置的,不需要你去下载第三方的包啥的,贼方便。
交叉编译
Mac 下编译, Linux 或者 Windows 下去执行
1 2 3 4
| # 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 或者 Windows 下去执行
1 2 3 4
| # 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 下执行 , Mac 或 Linux 下去执行
需要写一个批处理程序,在里面去设置,因为windows 下的 terminal 不支持shell , 这跟 Mac 和 Linux下的有点不同
1 2 3 4 5
| # Mac 下执行 SET CGO_ENABLED=0 SET GOOS=darwin SET GOARCH=amd64 go build main.go
|
1 2 3 4 5
| # 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
GOARCH
:目标平台的体系架构【386,amd64,arm】, 目前市面上的个人电脑一般都是amd64架构的
- 386 也称 x86 对应 32位操作系统
- amd64 也称 x64 对应 64位操作系统
- arm 这种架构一般用于嵌入式开发。 比如 Android , IOS , Win mobile , TIZEN 等
linux 或者 Mac下 go build 前面的参数为何需要那样设置?
go env 可以列出我们的golang 默认环境变量,在shell中当我们只想一次性更改其环境变量时,就可以通过在shell中设置变量的方式来更改这个环境变量。
案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| //默认 >#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" >#
|