【翻译】Go 1.1 交叉编译
為什么80%的碼農都做不了架構師?>>> ??
這是一篇針對我在去年8月所寫文章針對 Go 1.1 版本的更新補充介紹。自去年以來,像 goxc 這類?shell 封裝工具已經誕生,從而為 Go 交叉編譯和部署提供了一套完整的解決方案。
介紹
Go 對在外部機器上部署二進制文件而無需安裝任何環境的支持非常好。這對于測試需要使用構建指令的包或者目標平臺不適宜部署開發環境時是非常方便的。
對于構建與 Go 版本相匹配的交叉編譯功能已經內置在了 Go 的構建腳本中;只要看看 GOOS、GOARCH,可能的話再看看 GOARM 就可以發現它們都在 ./make.bash 中被調用。因此,接下來的實現方案只是用于簡化你的工作。
入門
1. 使用源碼安裝 Go。具體操作步驟可以在?golang.org/doc/install/source?找到。如果你已經非常熟悉安裝過程,下面是一個簡單的安裝指示:
% hg clone https://code.google.com/p/go % cd go/src % ./all.bash 2. 從 Github 上檢出用于支持交叉編譯的腳本: github.com/davecheney/golang-crosscompile。 % git clone git://github.com/davecheney/golang-crosscompile.git % source golang-crosscompile/crosscompile.bash3. 編譯所有 Go 所支持的平臺。
% 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 上的程序:
% 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 上使用。
一些警告
交叉編譯二進制,而非 Go 開發環境
這篇文章講述了如何構建目標環境上的 Go 程序,而不是構建目標環境上 Go 的開發環境。如果你想要構建 Go 開發環境,需要直接在相應環境下安裝。對于大多數平臺而言,你需要從源碼安裝,或者使用 Go 官方提供的安裝包,如果你樂意使用的話。
不支持 cgo 的交叉編譯
目前無法在開啟 cgo 編譯模式的情況下進行交叉編譯,這是因為 cgo 涉及到的相關函數直接依賴于構建程序所在的操作系統。而且由于各個平臺默認的 C 編譯器不盡相同,所編譯出的程序可能無法兼容。
在 Go 1.1 中使用交叉編譯時,CGO_ENBALED 會被設置為默認值 0(關閉)。
目標平臺為 linux/arm 時需要設置 GOARM
因為一些 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
轉載于:https://my.oschina.net/Obahua/blog/144622
總結
以上是生活随笔為你收集整理的【翻译】Go 1.1 交叉编译的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C之约瑟夫问题
- 下一篇: 开机出现“CPU fan error