Mac下進行golang的交叉編譯

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

      由於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平台下啟動並執行軟體!

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.