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
。その原因は何でしょうか?
これらの指示を見つけました Raspberry Pi用のクロスコンパイラをビルドする方法 。 crosstool-ng
クロスコンパイラビルドA LOT(Nice cursesベースのインターフェイスがあります)の構成を簡素化し、GCC 4.7をサポートするツール。
うまくいくようです!
http://github.com/dwelch67/raspberrypibuildgcc directory 4.7 gcc/gnuと3.0 clang/llvmの両方のスクリプトがあります。 gnuは、opencoresのmpxプロジェクトのスクリプトから派生したもので、gdbを切り取り、libgcc、glibcなどをコンパイラーに持ち込みました。あなたが他のものがミップのアームをカットアンドペーストしたい場合。
ここにステップバイステップガイドがあります 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.7 gccが見つかりませんでした。4.6だけです。詳細については、このページのガイドラインに従って、かなり古いUbuntuマシン(1Ghz、768MB RAM)でPiのカーネルをコンパイルしました。 Kernel compilation
ビルドには約90分かかりましたが、Piの場合は6時間かかることが示唆されています。カーネルはPiで正常に動作します。おそらく、x86 Linuxマシンで他のプロジェクトをクロスコンパイルするために、これらのガイドラインを適合させることができます。
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
も組み込まれています。
Raspberry-GCC-4.7. ツールチェーンを試すことができます。
これは、gnueabiを使用したhardfpを備えたarmv6用のビルド済みgcc-4.7.3ツールチェーンです。私はそれを使用して、ラズベリーのターゲット用にc ++ 11をクロスコンパイルします。
Linux x86_64ホストでのみ機能することに注意してください。
このプロジェクトには、プリコンパイル済み/ビルド済みのRaspberry Pi GCCクロス&ネイティブコンパイラバイナリのUpToDateセットが含まれているため、膨大な時間を節約できます(コンパイルやエラー処理は一切必要ありません)。マシンのGCC(Raspberry Pi)機能を完全に抽出、リンクしてお楽しみください。 Raspberry Pi用のネイティブコンパイラを使用できます(古い&遅い6.3.0 GCCと共に使用できます)、または任意のLinuxマシンでクロスコンパイラを使用して(最新のUbuntu/bionic x64でテスト済み)、Raspberry Pi用のプログラムをコンパイルします。これらのコンパイラバイナリはすべて、全体的なパフォーマンスを強化するために最適化されたRaspberry Piハードウェアです。
サポートされているGCCバージョン:
サポートされているラズベリーパイ:
サポートされている環境:
サポートされている言語:
既に述べたように、Raspberry Piでのビルドは低速ですが、メモリが不足しない限り、信頼性が高くなります(クロスコンパイルされないため)。おそらく、メモリを調整し、設定を交換して、より大きなビルドを可能にすることができます(高速でない場合)。私はフォーラムで、ルートパーティションをSDに、ユーザーパーティションをUSBドライブに配置することについて話していることを知っています。もちろん、高速(クラス6以上)のSDカードを入手することはおそらく違いをもたらすでしょう。時間の経過とともに、ソフトウェアの改善に伴いコンパイルのパフォーマンスが向上する可能性があります。または、Raspberry Pi 2のチップセットが改善され、RAMが増える可能性があります。 :-)