這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
最近在玩2樣東西,一樣是go語言(golang),一樣是Raspberry Pi(樹莓派)。那麼能在Raspberry上運行go語言程式嗎?
Golang的文檔上說是支援多平台的,其中也包括了ARM,看來有戲了,興沖沖開啟http://code.google.com/p/go/downloads/list (golang編譯器的下載頁面) ,卻發現沒有arm平台的二進位大包下載。所以arm平台下的需要下載源碼自己編譯。
Raspberry上編譯前準備及配置
一。俗話說巧婦難為無米之炊,要編譯源碼先得下源碼,下載後這裡解壓到 /home/pi/go 目錄下。
二。確認需要的工具系統已經具備了:mercurial 、gcc 和 libc6-dev 。如果不確定有沒有只需輸入下列命令:
sudo apt-get install -y mercurial gcc libc6-dev
以上命令實現安裝3個必需的工具。
三。配置環境變數。因為第一點的時候我把下載下來的源碼解壓到/home/pi/go 目錄下了,所以將GOROOT變數值設定為該路徑:
export GOROOT=/home/pi/go
export GOARCH=arm
但其實不設定的話也是可以的,它預設是等一下命令列執行位置的父目錄。
四。也是配置環境變數。GOARM 變數可以不設定,預設值為:“6″。但是實際中證明,如果不設定為值為“5″的話,編譯會出現如下的錯誤:SIGILL: illegal instruction 。那麼設定為5和6有什麼區別呢?將 GOARM 設定為5會引起連接器發出指令來調用軟體浮點數實現,而非使用硬體浮點數支援。
export GOARM=”5″
五。分配更多的記憶體給cpu使用。這不是必須的,更大的記憶體有助於縮減編譯時間。使用:sudo raspi-config 中的memory_split功能來實現。
Raspberry上編譯golang
開啟命令列,進入go目錄下的src目錄:
cd /home/pi/go/src
運行all.bash指令碼
./all.bash
或者你想看看整個編譯耗時多少的話可以這樣:
time ./all.bash
好了。經過漫長的時間後:
pi@raspberrypi ~/go/src $ time ./all.bash
real 47m34.894s
user 44m23.260s
sys 2m6.690s
整個過程消耗了47分鐘。編譯完成了。而在我的電腦上這個過程只需要3分鐘。
小結
以上過程只是在Rapsberry上編譯golang的編譯器,如果我們只想在Raspberry上運行go語言編寫的程式,那大可不用這樣子,我們可以使用交叉編譯在自己的電腦上完成代碼的編譯後copy到Raspberry上運行便可了。
如何上golang官網
最近發現go語言的官網已經無法訪問了,這給學習帶來很多不便。這裡提供一個比較簡單的方法。
一。輸入命令:nslookup www.google.com 8.8.8.8
得到google的ip地址清單若干,然後隨機複製一個ip,在瀏覽器上輸入,看看能否開啟google的搜尋網頁面。如果能,則繼續第二步。
二。開啟系統hosts檔案,ubuntu12下預設為/etc/hosts 。加入一行:
<第一步得到的ip地址> golang.org
例如:74.125.128.102 golang.org
好了,看看可以開啟官網了嗎!
在ubuntun上編譯go程式在Raspberry上運行
其實就是交叉編譯。將golang源碼解壓到/home/lixin/soft/goarm5目錄下。
命令列進入到/home/lixin/soft/goarm5/src 。
運行如下命令:
export GOROOT=/home/lixin/soft/goarm5
export GOARCH=arm
export GOARM=5
./all.bash
大概幾分鐘後,就建好了適合Raspberry上啟動並執行編譯器了。
接著來些個hello world測試程式。
vim /home/lixin/main.go
main.go檔案內容如下:
package main
import “fmt”
func main(){
fmt.Println(“hello lixin”)
}
交叉編譯:
/home/lixin/soft/goarm5/bin/go build ./main.go
將產生的main檔案拷貝到Raspberry上運行。非常好,正確的在螢幕中列印出“hello lixin”