前言
Golang 支持交叉編譯, 在一個平臺上生成而後再另一個平臺去執行。 並且編譯的工具【build】這個工具是Golang 內置的,不須要你去下載第三方的包啥的,賊方便。linux
交叉編譯
Mac 下編譯, Linux 或者 Windows 下去執行
# 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 下去執行
# 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下的有點不一樣golang
# 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
- 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中設置變量的方式來更改這個環境變量。shell
案例
//默認 >#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" ># 複製代碼