Mac下進行golang的交叉編譯
由於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/sh
set -e
for arch in 8 6 5; do
for cmd in a c g l; do
go tool dist install -v cmd/$arch$cmd
done
done
exit 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/sh
if [ -z "$1" ]; then
echo 'GOOS is not specified' 1>&2
exit 2
else
export GOOS=$1
if [ "$GOOS" = "windows" ]; then
export CGO_ENABLED=0
fi
fi
shift
if [ -n "$1" ]; then
export GOARCH=$1
fi
cd $GOROOT
go tool dist install -v ../pkg
go 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平臺下執行的軟體!