golang中跨平臺交叉編譯涉及兩個重要的環境變量:GOOS 和 GOARCH,分別表明 Target Host OS 和 Target Host ARCH. 若是沒有顯式設置這些環境變量,咱們經過go env能夠看到go編譯器眼中這兩個環境變量的當前值linux
GOARCH="amd64" // 程序構建環境的目標計算架構 GOBIN="/data/server/go/bin" // 存放可執行文件的目錄的絕對路徑 GOEXE="" // 可執行文件的後綴 GOHOSTARCH="amd64" // 程序運行環境的目標計算架構 GOHOSTOS="linux" // 程序運行環境的目標操做系統 GOOS="linux" // 程序構建環境的目標操做系統 GOPATH="/data/code" // 工做區目錄的絕對路徑 GORACE="" // 用於數據競爭檢測的相關選項 GOROOT="/data/server/go" // Go語言的安裝目錄的絕對路徑 GOTOOLDIR="/data/server/go/pkg/tool/linux_amd64" // Go工具目錄的絕對路徑 GCCGO="gccgo" CC="gcc" GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build410649157=/tmp/go-build" CXX="g++" CGO_ENABLED="1" // 指明cgo工具是否可用的標識 CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config"
// linux 環境變量設置 /etc/profile export GOROOT=/data/server/go export GOPKG=$GOROOT/pkg/tool/linux_amd64 export GOARCH=amd64 export GOOS=linux export GOPATH=/data/code export GOBIN=$GOROOT/bin:$GOPATH/bin export PATH=$PATH:$GOBIN:$GOPKG:$GOPATH/bin
若是想要跨平臺編譯go程序,只需在build的時候制定目標主機的os和arch,以下例子所示所示golang
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go // win x64 CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o main main.go // win x64 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go // linux x64 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o main main.go // linux x64 CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go // mac x64 CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o main main.go // mac x64
其中兩者能夠設置以下參數:windows
$GOOS $GOARCH darwin 386 darwin amd64 freebsd 386 freebsd amd64 linux 386 linux amd64 linux arm incomplete windows 386 incomplete
若是想要編譯其餘平臺的可執行腳本,秩序指定相應的os和arch便可。bash
go build命令的經常使用標記說明架構
-a 強行對全部涉及到的代碼包(包含標準庫中的代碼包)進行從新構建,即便它們已是最新的了。 -n 打印編譯期間所用到的其它命令,可是並不真正執行它們。 -p n 指定編譯過程當中執行各任務的並行數量(確切地說應該是併發數量)。在默認狀況下,該數量等於CPU的邏輯核數。可是在darwin/arm平臺(即iPhone和iPad所用的平臺)下,該數量默認是1。 -race 開啓競態條件的檢測。不過此標記目前僅在linux/amd6四、freebsd/amd6四、darwin/amd64和windows/amd64平臺下受到支持。 -v 打印出那些被編譯的代碼包的名字。 -work 打印出編譯時生成的臨時工做目錄的路徑,並在編譯結束時保留它。在默認狀況下,編譯結束時會刪除該目錄。 -x 打印編譯期間所用到的其它命令。注意它與-n標記的區別。