web-dev-qa-db-ja.com

GCCでのRaspberry Piのクロスコンパイル。どこから始めれば?

TL/DR:ARM (gnueabi)プラットフォーム(Raspberry Piデバイスでの実行を目的としています)?

新しいRaspberry Piを手に入れたばかりで、そのためのプログラミングを始めたいと強く思っています。 GCCツールチェーンをインストールし(Arch Linuxシステムイメージを使用しています)、いくつかの基本的なプログラムをコンパイルしましたが、すべて正常に動作しています。

Boostライブラリをコンパイルしようとしたこともあります。これは、プロジェクトで頻繁に使用するためで、指示に従うことですべてが正常に動作するように思えたためです(./bootstrap.sh + ./b2)コンパイルが非常に遅いという事実を除いて。数時間そのままにしておきましたが、最初のいくつかのソースファイルをほとんど通過しませんでした。夜実行した後、ビルドプロセスがRAM不足のために中止されたことを発見しました。

したがって、Rasp Piは、Boostなどのサイズのものをコンパイルするだけでは不十分です。そのため、クロスコンパイルが思い浮かびます。ただし、ARMクロスコンパイルはオンラインで入手できますが、多くの情報がありますが、混乱を招きます。

Raspberry Piで利用可能な最新のGCCバージョン(4.7.0)があるので、理想的には同じバージョンでクロスコンパイルしたいと思います。 ARM用のGCC 4.7.0ツールチェーンはどこで入手できますか? (x86 CentOS 6.2でコンパイルします)

編集:

ビルドファイルがNFS共有上にある間に、不要なGPUメモリの割り当てを解除し、USBドライブに4GBのスワップパーティションを設定しました。 Boostは現在、はるかに高速にコンパイルされているため、管理が容易です。ただし、x86 PCでのクロスコンパイル用にGCC 4.7ツールチェーンをどのようにセットアップできるかを知りたいと思います。多くのコンパイルを行うつもりで、できる限り高速にしたいからです。

編集2:

GCC 4.7.0は比較的新しいため、ビルド済みのクロスコンパイラ(i386-> ARM)はないようです。私はおそらく自分で1つを構築する必要がありますが、これは重要なタスクのようです(試しましたが失敗しました)誰かがGCCクロスコンパイラを構築するために従うべきチュートリアルを知っていますか?できれば最近のバージョンの1つについて?

この素晴らしいシェルスクリプト (これは同じアーキテクチャのコンパイラを構築するのに最適です)で試してみましたが、binutilsとGCCの前提条件を正常に構築しましたが、GCCの構築は失敗し続けました多くの不可解なエラーがあります。私はここで本当に行方不明になっているので、あなたの助けに感謝します。

Raspberry PiのGCCは、

--prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib 
--mandir=/usr/share/man --infodir=/usr/share/info 
--with-bugurl=https://bugs.archlinux.org/ 
--enable-languages=c,c++,fortran,lto,objc,obj-c++ --enable-shared 
--enable-threads=posix --with-system-zlib --enable-__cxa_atexit 
--disable-libunwind-exceptions --enable-clocale=gnu 
--disable-libstdcxx-pch --enable-libstdcxx-time 
--enable-gnu-unique-object --enable-linker-build-id --with-ppl 
--enable-cloog-backend=isl --enable-lto --enable-gold 
--enable-ld=default --enable-plugin --with-plugin-ld=ld.gold 
--with-linker-hash-style=gnu --disable-multilib --disable-libssp 
--disable-build-with-cxx --disable-build-poststage1-with-cxx 
--enable-checking=release --Host=arm-unknown-linux-gnueabi 
--build=arm-unknown-linux-gnueabi 

編集3:

ARM(yay!) このシェルスクリプト を使用して、コメントのユーザーdwelchによって示唆されているように、4.7 GCCツールチェーンを構築できました。また、newlibおよびlibstdc++この記事 をガイドとして使用します。ツールチェーンは正常に機能しますが、Raspberry Piで実行可能ファイルを実行すると、Illegal instruction。その原因は何でしょうか?

52
Tibor

これらの指示を見つけました Raspberry Pi用のクロスコンパイラをビルドする方法crosstool-ngクロスコンパイラビルドA LOT(Nice cursesベースのインターフェイスがあります)の構成を簡素化し、GCC 4.7をサポートするツール。

うまくいくようです!

24
Tibor

http://github.com/dwelch67/raspberrypibuildgcc directory 4.7 gcc/gnuと3.0 clang/llvmの両方のスクリプトがあります。 gnuは、opencoresのmpxプロジェクトのスクリプトから派生したもので、gdbを切り取り、libgcc、glibcなどをコンパイラーに持ち込みました。あなたが他のものがミップのアームをカットアンドペーストしたい場合。

4
old_timer

ここにステップバイステップガイドがあります WindowsでRaspberry Piクロスコンパイラをビルドする方法Illegal Instructionエラーが発生する理由は最新であるRaspbianはhardfp対応であり、gfpとeglibcがhardfpをサポートするための適切なパッチが必要です。そうでない場合、生成されたコードは異なるABIを使用します。つまり、異なるレジスタに関数の引数を渡すため、実行時にクラッシュします。

また、ARMv7(Raspebby PiはARMv6)のGCCを誤って設定すると、Illegal Instructionエラーが発生する場合があります。 GCCを設定するときは、必ず--with-Arch=armv6オプションを指定してください。

ただし、上記のガイドはGCC 4.6.3に基づいています。しかし、GCC 4.7でも動作するはずです。

4
Mikhail Kupchik

4.7 gccが見つかりませんでした。4.6だけです。詳細については、このページのガイドラインに従って、かなり古いUbuntuマシン(1Ghz、768MB RAM)でPiのカーネルをコンパイルしました。 Kernel compilation

ビルドには約90分かかりましたが、Piの場合は6時間かかることが示唆されています。カーネルはPiで正常に動作します。おそらく、x86 Linuxマシンで他のプロジェクトをクロスコンパイルするために、これらのガイドラインを適合させることができます。

2
NickT

dockcrossプロジェクト は、完全に脱臭されたツールチェーンの素晴らしい出発点です。Piだけでなく、他の何かのために構築できます。コマンドは次のとおりです。

docker run --rm dockcross/linux-armv7 > ./dockcross-linux-armv7
chmod +x ./dockcross-linux-armv7
./dockcross-linux-armv7 bash -c '$CC test/C/hello.c -o hello_arm'

cmakeも組み込まれています。

1
Zeev Glozman

Raspberry-GCC-4.7. ツールチェーンを試すことができます。

これは、gnueabiを使用したhardfpを備えたarmv6用のビルド済みgcc-4.7.3ツールチェーンです。私はそれを使用して、ラズベリーのターゲット用にc ++ 11をクロスコンパイルします。

Linux x86_64ホストでのみ機能することに注意してください。

1
kallaballa

この最新の GitHubリポジトリ から、Raspberry Pi用のオープンソースのビルド済み/コンパイル済みのGCC Cross&Native Compiler Binariesを試すことができます。

このプロジェクトには、プリコンパイル済み/ビルド済みのRaspberry Pi GCCクロス&ネイティブコンパイラバイナリのUpToDateセットが含まれているため、膨大な時間を節約できます(コンパイルやエラー処理は一切必要ありません)。マシンのGCC(Raspberry Pi)機能を完全に抽出、リンクしてお楽しみください。 Raspberry Pi用のネイティブコンパイラを使用できます(古い&遅い6.3.0 GCCと共に使用できます)、または任意のLinuxマシンでクロスコンパイラを使用して(最新のUbuntu/bionic x64でテスト済み)、Raspberry Pi用のプログラムをコンパイルします。これらのコンパイラバイナリはすべて、全体的なパフォーマンスを強化するために最適化されたRaspberry Piハードウェアです。

サポートされているGCCバージョン:

  • GCC 6.3.0
  • GCC 7.4.0
  • GCC 8.2.0
  • GCC 8.3.0

サポートされているラズベリーパイ:

  • 現在、すべてのRaspberry Piバージョン/モデルがサポートされています。
  • その他のARM同様のハードウェア構成のデバイスも機能する場合があります。

サポートされている環境:

  • Cross-Compiler:すべてのLinuxディストリビューション(x32/x64)が現在サポートされています。
  • ネイティブコンパイラ:Raspbian OSを搭載したすべてのRaspberry Piバージョン/モデルがサポートされています。他のOSは動作する場合と動作しない場合があります。

サポートされている言語:

  • C++
  • C
  • Fortran
0
abhiTronix

既に述べたように、Raspberry Piでのビルドは低速ですが、メモリが不足しない限り、信頼性が高くなります(クロスコンパイルされないため)。おそらく、メモリを調整し、設定を交換して、より大きなビルドを可能にすることができます(高速でない場合)。私はフォーラムで、ルートパーティションをSDに、ユーザーパーティションをUSBドライブに配置することについて話していることを知っています。もちろん、高速(クラス6以上)のSDカードを入手することはおそらく違いをもたらすでしょう。時間の経過とともに、ソフトウェアの改善に伴いコンパイルのパフォーマンスが向上する可能性があります。または、Raspberry Pi 2のチップセットが改善され、RAMが増える可能性があります。 :-)

0
mlepage