どのようにUbuntuの上でコンパイルCGO ARMアーキテクチャを横断します

我々は、すべての移動クロスコンパイラは非常に簡単です、それはCGOに関与していないときにことを知って、ちょうど対応するGOOSとGOARCH缶を設定し、それがCGOに来るとき、あなたが特定のGCCを指定する必要があるため、問題は、少し複雑になります。

たとえば、Ubuntuの、ターゲットCPUアーキテクチャアーム上のCGOを持つダイナミックライブラリをコンパイル横切るように、どのように我々はそれを動作させるのですか?

サンプルコード

# shared.go
package main

import "C"

//export Sum
func Sum(a, b int) int {
    return a + b
}

func main(){}

このコードは、CGOに使用され、その後合計方法にさらされる、2つの整数を実装します。

アーム32をコンパイル

そのため、オープンCGOコンパイラCGO_ENABLED = 1を提供することで、次のコマンドを実行します。

CGO_ENABLED=1 GOOS=linux GOARCH=arm go build -buildmode=c-shared -o share.so 

残念ながら、コマンドエラー:GCC:エラー:認識できないコマンドラインオプション「-marm」。

私は冒頭で述べたように、クロスコンパイラCGOは、次のようにコマンドをインストールし、32ビットGCC-アームのLinux gnueabihfを使用することができ、特定のクロスコンパイラツールアームとアッパーアームUbuntuのコンパイラを選択します。

sudo apt-get update
sudo apt-get install gcc-arm-linux-gnueabihf

インストールが完了したら、CCの再コンパイルを指定します。

CGO_ENABLED=1 GOOS=linux GOARCH=arm CC=arm-linux-gnueabihf-gcc go build -buildmode=c-shared -o share.so 

正常に実行するためのコマンドは、ディレクトリ、ファイルコマンドを使用して、そのプロパティを表示するには、share.soというファイルを生成してきた、あなたは確かに32バージョンを武装することを確認することができます。

share.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=7b23579ddcbebdfc8f4b68512859661a45d66996, not stripped

アームの64をコンパイルされました

クロスコンパイル時には、だけでなく、GCCのための最適なプラットフォームのためにだけでなく、オペレーティングシステムのビット数を選択するには、64の異なるGCCを選択する必要があり、GCC-リナロ-5.3から2016.02-x86_64_aarch64-linuxの-gnu.tarここで推奨しました.xz。

インストールコマンド:

wget https://releases.linaro.org/components/toolchain/binaries/5.3-2016.02/aarch64-linux-gnu/gcc-linaro-5.3-2016.02-x86_64_aarch64-linux-gnu.tar.xz 

tar xvf gcc-linaro-5.3-2016.02-x86_64_aarch64-linux-gnu.tar.xz -C /usr/lib/

echo 'export PATH="$PATH:/usr/lib/gcc-linaro-5.3-2016.02-x86_64_aarch64-linux-gnu/bin"' >> ~/.bashrc

source ~/.bashrc

インストールが完了し、再コンパイルコマンドです:

CGO_ENABLED=1 GOOS=linux GOARCH=arm64 CC=aarch64-linux-gnu-gcc-5.3.1 go build -buildmode=c-shared -o share.so 

成功したコンパイル、およびshare.soの文書を作成し、我々はメタ情報を表示share.so同じファイルを使用しています:

share.so: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5b0e7ff7c3af178039a7b934df8ca3e7572ab5b5, not stripped

これまでのところ、我々が正常にUbuntuのシステム上の2つのバージョンCGOプログラムアームとarm64をクロスコンパイルしています。

概要

ゴーそれはクロスコンパイルするCGOが来る、唯一GOOSとGOARCHが十分ではありません指定、あなたはまた、CCパラメータによってGCCの適切なバージョンを指定する必要があり、GCCと選択の現在のシステムとに関連するターゲット・アーキテクチャ:

  1. (32ビットまたは64ビットを含む)は、クロスコンパイラターゲットCPUアーキテクチャ。
  2. クロスコンパイラのオペレーティング・システム。

おすすめ

転載: blog.51cto.com/51reboot/2454221