【翻譯】Go 1.1 交叉編譯

這是一篇針對我在去年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.bash
2. 從 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 開發環境,須要直接在相應環境下安裝。對於大多數平臺而言,你須要從源碼安裝,或者使用 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

相關文章
相關標籤/搜索