這是一篇針對我在去年8月所寫文章針對 Go 1.1 版本的更新補充介紹。自去年以來,像 goxc 這類 shell 封裝工具已經誕生,從而爲 Go 交叉編譯和部署提供了一套完整的解決方案。 linux
Go 對在外部機器上部署二進制文件而無需安裝任何環境的支持很是好。這對於測試須要使用構建指令的包或者目標平臺不適宜部署開發環境時是很是方便的。 git
對於構建與 Go 版本相匹配的交叉編譯功能已經內置在了 Go 的構建腳本中;只要看看 GOOS、GOARCH,可能的話再看看 GOARM 就能夠發現它們都在 ./make.bash 中被調用。所以,接下來的實現方案只是用於簡化你的工做。 github
1. 使用源碼安裝 Go。具體操做步驟能夠在 golang.org/doc/install/source 找到。若是你已經很是熟悉安裝過程,下面是一個簡單的安裝指示: golang
% hg clone https://code.google.com/p/go % cd go/src % ./all.bash2. 從 Github 上檢出用於支持交叉編譯的腳本: github.com/davecheney/golang-crosscompile。
% git clone git://github.com/davecheney/golang-crosscompile.git % source golang-crosscompile/crosscompile.bash
3. 編譯全部 Go 所支持的平臺。 shell
% go-crosscompile-build-all go-crosscompile-build darwin/386 go-crosscompile-build darwin/amd64 go-crosscompile-build freebsd/386 go-crosscompile-build freebsd/amd64 go-crosscompile-build linux/386 go-crosscompile-build linux/amd64 go-crosscompile-build linux/arm go-crosscompile-build windows/386 go-crosscompile-build windows/amd64這將會編譯每一個平臺的 Go runtime 和標準庫,你能夠在 go/pkg 目錄下看到下列包:
% ls -1 go/pkg darwin_386 darwin_amd64 freebsd_386 freebsd_amd64 linux_386 linux_amd64 linux_arm obj tool windows_386 windows_amd64
源文件 crosscompile.bash 中提供了針對各個平臺的 go-$GOOS-$GOARC 函數,你能夠將它做爲你的標準 Go tool。例如,編譯一個運行在 linux/arm 上的程序: windows
% cd $GOPATH/github.com/davecheney/gmx/gmxc % go-linux-arm build % file ./gmxc ./gmxc: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped
這個文件沒法在宿主系統(如 darwin/amd64)上運行,但能夠在 linux/arm 上使用。 bash
這篇文章講述瞭如何構建目標環境上的 Go 程序,而不是構建目標環境上 Go 的開發環境。若是你想要構建 Go 開發環境,須要直接在相應環境下安裝。對於大多數平臺而言,你須要從源碼安裝,或者使用 Go 官方提供的安裝包,若是你樂意使用的話。 函數
目前沒法在開啓 cgo 編譯模式的狀況下進行交叉編譯,這是由於 cgo 涉及到的相關函數直接依賴於構建程序所在的操做系統。並且因爲各個平臺默認的 C 編譯器不盡相同,所編譯出的程序可能沒法兼容。 工具
在 Go 1.1 中使用交叉編譯時,CGO_ENBALED 會被設置爲默認值 0(關閉)。 測試
由於一些 arm 平臺的硬件缺失浮點單位,GOARM 的值是用於告知連接器是使用硬件仍是軟件浮點代碼。根據不一樣平臺的須要,你可能會在構建程序時修改下列環境變量:
% GOARM=5 go-linux-arm build
從版本 e4b20018f797 起,你將會可能很是友好的錯誤提示來告知你須要將 GOARM 設置爲什麼值。
$ ./gmxc runtime: this CPU has no floating point hardware, so it cannot run this GOARM=7 binary. Recompile using GOARM=5.
若是你不對 GOARM 進行設置,則默認使用硬件浮點單位。你能夠閱讀更多有關 Go 在 linux/arm 上的相關文章: Go Language Community Wiki 。
原文地址: http://dave.cheney.net/2013/07/09/an-introduction-to-cross-compilation-with-go-1-1