1. 程式人生 > >Mac下進行golang的交叉編譯

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平臺下執行的軟體!