【翻译】Go 1.1 交叉编译
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
這是一篇針對我在去年8月所寫文章針對 Go 1.1 版本的更新補充介紹。自去年以來,像 goxc 這類?shell 封裝工具已經(jīng)誕生,從而為 Go 交叉編譯和部署提供了一套完整的解決方案。
介紹
Go 對在外部機器上部署二進制文件而無需安裝任何環(huán)境的支持非常好。這對于測試需要使用構(gòu)建指令的包或者目標(biāo)平臺不適宜部署開發(fā)環(huán)境時是非常方便的。
對于構(gòu)建與 Go 版本相匹配的交叉編譯功能已經(jīng)內(nèi)置在了 Go 的構(gòu)建腳本中;只要看看 GOOS、GOARCH,可能的話再看看 GOARM 就可以發(fā)現(xiàn)它們都在 ./make.bash 中被調(diào)用。因此,接下來的實現(xiàn)方案只是用于簡化你的工作。
入門
1. 使用源碼安裝 Go。具體操作步驟可以在?golang.org/doc/install/source?找到。如果你已經(jīng)非常熟悉安裝過程,下面是一個簡單的安裝指示:
% 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 和標(biāo)準(zhǔn)庫,你可以在 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使用你的交叉編譯環(huán)境
源文件?crosscompile.bash 中提供了針對各個平臺的?go-$GOOS-$GOARC 函數(shù),你可以將它作為你的標(biāo)準(zhǔn) 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
這個文件無法在宿主系統(tǒng)(如 darwin/amd64)上運行,但可以在 linux/arm 上使用。
一些警告
交叉編譯二進制,而非 Go 開發(fā)環(huán)境
這篇文章講述了如何構(gòu)建目標(biāo)環(huán)境上的 Go 程序,而不是構(gòu)建目標(biāo)環(huán)境上 Go 的開發(fā)環(huán)境。如果你想要構(gòu)建 Go 開發(fā)環(huán)境,需要直接在相應(yīng)環(huán)境下安裝。對于大多數(shù)平臺而言,你需要從源碼安裝,或者使用 Go 官方提供的安裝包,如果你樂意使用的話。
不支持 cgo 的交叉編譯
目前無法在開啟 cgo 編譯模式的情況下進行交叉編譯,這是因為 cgo 涉及到的相關(guān)函數(shù)直接依賴于構(gòu)建程序所在的操作系統(tǒng)。而且由于各個平臺默認(rèn)的 C 編譯器不盡相同,所編譯出的程序可能無法兼容。
在 Go 1.1 中使用交叉編譯時,CGO_ENBALED 會被設(shè)置為默認(rèn)值 0(關(guān)閉)。
目標(biāo)平臺為 linux/arm 時需要設(shè)置 GOARM
因為一些 arm 平臺的硬件缺失浮點單位,GOARM 的值是用于告知鏈接器是使用硬件還是軟件浮點代碼。根據(jù)不同平臺的需要,你可能會在構(gòu)建程序時修改下列環(huán)境變量:
% GOARM=5 go-linux-arm build從版本?e4b20018f797?起,你將會可能非常友好的錯誤提示來告知你需要將 GOARM 設(shè)置為何值。
$ ./gmxc runtime: this CPU has no floating point hardware, so it cannot run this GOARM=7 binary. Recompile using GOARM=5.
如果你不對 GOARM 進行設(shè)置,則默認(rèn)使用硬件浮點單位。你可以有關(guān) Go 在 linux/arm 上的相關(guān)文章: Go Language Community Wiki 。
原文地址: http://dave.cheney.net/2013/07/09/an-introduction-to-cross-compilation-with-go-1-1
轉(zhuǎn)載于:https://my.oschina.net/Obahua/blog/144622
總結(jié)
以上是生活随笔為你收集整理的【翻译】Go 1.1 交叉编译的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C之约瑟夫问题
- 下一篇: 开机出现“CPU fan error