這是一個建立於
的文章,其中的資訊可能已經有所發展或是發生改變。
由於golang的出身,對於linux的支援是最好的,相應來說,Mac的支援也很不錯,對windows的支援是最差的。
進行交叉編譯最好是從源碼開始編譯,而且在交叉編譯中是不支援cgo的,這點請注意。
1. 獲得golang的源碼
這個當然是從官方網站下載了,只是golang是google推出的語言,所以需要翻個牆。我下載了1.4.2的golang的tar包,然後解壓。雖說只需配置正確,可以放到任意位置,但還是推薦放到/usr/local目錄下。請注意,這個時候還沒有編譯工具,不僅交叉編譯不行,本地編譯都是不行的。
設定GOROOT環境變數,PATH裡面增加路徑
2. 編譯原生工具鏈
cd $GOROOT\src
./make/bash
編譯之後就能看到/usr/local/go目錄下多了一個bin目錄,裡面存放了本地編譯所需要的工具,這個時候原生編譯就可以原生編譯了。
對比我們可以很清楚的看到變化。
3. 構建跨平台的編譯器和連結器
我們前面產生的工具鏈是針對原生,也就是Mac下使用的,要支援交叉編譯,顯然需要支援其他平台的工具鏈,所以這一步就是用來構建這樣的工具鏈。
這一步是運行一個buildcmd的指令檔,檔案內容如下所示。其中,8x表示386的架構、6x表示amd64的架構、5x表示arm的架構。
運行這個檔案後,會產生指定架構下的編譯和連結工具。
#!/bin/shset -efor arch in 8 6 5; do for cmd in a c g l; do go tool dist install -v cmd/$arch$cmd donedoneexit 0
4.構建目標版本的標準命令工具和庫
和本機一樣,我們需要交叉編譯哪個平台的內容,就需要編譯出目標平台的工具鏈。我們先看一下go env運行顯示的一些環境參數。
這裡GOARCH和GOOS分布代表目標平台的架構和OS資訊,GOHOSTARCH和GOHOSTOS代表宿主機的架構和OS資訊。
因為我們是在Mac環境下,現在GOHOSTARCH就是amd64,GOHOSTOS就是darwin,這個是不變的;預設GOARCH和GOOS是本機平台,我們要交叉編譯,就是要把這兩個參數改變之後,運用相關的工具鏈進行編譯連結,產生可用的image。
我們在看一下/usr/local/go/bin目錄,剛才我們產生了這個目錄,並把它加入了PATH環境變數。這個目錄裡面存放了編譯工具,顯然,目前只能編譯本機。我們要產生能編譯目標平台的工具,所以我們再次運行make.bash,不過需要指定GOARCH和GOOS,假定我們需要編譯32位windows下的軟體,則命令如下:
GOARCH=386 GOOS=windows ./make.bash
如果有許可權問題,請加上sudo
這個時候我們再看/usr/local/go/bin目錄,是不是看見新增加了一個windows_386的目錄?裡面存放的就是我們要的編譯工具。
5. 構建目標版本的標準庫
這一步是運行一個buildpkg的指令檔,檔案內容如下所示:
#!/bin/shif [ -z "$1" ]; then echo 'GOOS is not specified' 1>&2 exit 2else export GOOS=$1 if [ "$GOOS" = "windows" ]; then export CGO_ENABLED=0 fifishiftif [ -n "$1" ]; then export GOARCH=$1ficd $GOROOTgo tool dist install -v ../pkggo install -v -a std
這個指令碼用於傳遞使用這個指令碼需要傳入目標環境的OS和ARCH的參數,用於設定GOOS和GOARCH這兩個參數,然後產生目標平台下連結的標準庫。還是以32為的windows做例子,命令為:
./buildpkg windows 386
同樣,如有許可權問題,請用sudo
運行結束後,我們看一下/usr/local/go/pkg目錄,是不是增加了windows_386的目錄?裡面存放了相應的庫
6. 交叉編譯.go源檔案
前面的準備工作完成後,就可以正式編譯源檔案了。需要注意的是,我們仍然需要指定GOOS和GOARCH這兩個參數,如果不指定,會被認為編譯本地檔案,繼續以32位windows為例,命令如下:
CGO_ENABLED=0 GOOS=windows GOARCH=386 go build ./hello.go
其中,CGO_ENABLED=0表示不使用cgo,GOOS=windows表示目標平台是windows,GOARCH=386表示32位系統,然後編譯出的結果就是32位windows平台下啟動並執行軟體!
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。