Raspberry Piを使用して、コンピューターから、C++で記述された単純なhelloWorldをクロスコンパイルしようとしています。 Linux用のCodeSourceryツールチェーンを使用してコンパイルしています。
TFTPを使用してhelloWorldバイナリをraspBerryにコピーし、chmodを使用して実行権限を付与すると、次のエラーが表示されます。
「違法な指示」
バイナリ上に「ファイル」を作成すると、「ラズベリー:ELF 32ビットLSB実行可能ファイル、ARM、バージョン1(SYSV)、静的リンク、ストリップ」が表示されます。
これは、リンク時に「-static -static-libstdc ++」を使用したためです。
静的リンクを使用しない場合、エラーは「セグメンテーション違反」です。
コード:
/*
* main.cpp
*
* Created on: 26/06/2012
* Author: ccortiz
*/
#include <iostream>
using namespace std;
int main(void){
cout << "Hello Cross Compilling for ARM!" << endl << flush;
return 0;
}
プログラムを正しい方法でコンパイルして実行するにはどうすればよいですか?ありがとう。
Segmentation fault
エラーが発生する理由はABIとは異なります。 Raspbianを実行しているときのRaspberryPiはlinux-arm-gnueabihf
ABIを使用しており、ハードウェアでhardfpとVFPのサポートを想定しているため(ARMv6環境ではまれです)、GCCとEGLIBC用の追加パッチが必要です(これらのパッチはRaspbianリポジトリにあります)。
Code Sourceryクロスツールチェーンにはこれらのパッチがない可能性が高いため、別のABI(linux-arm-gnueabi
)を使用しているため、実行時にクラッシュします(カーネルABIはhardfp/softfpに依存しないため、静的リンクが機能します)。
Illegal Instruction
エラーが発生する可能性のあるもう1つの理由は、ARMv7用に構成されたCode Sourceryクロスツールチェーンであり、RaspberryPiはARMv6です。ただし、この場合、静的リンクと動的リンクの両方で同じエラーが発生します。
WindowsでRaspberry Piクロスコンパイラを構築する方法のステップバイステップガイドです 、両方のhardfp/softfpABIバージョン。結果として得られるクロスコンパイラはC++をサポートし、cygwinランタイムライブラリ(cygwin1.dll)に依存しません。
biicode を試すことをお勧めします。クロスコンパイラ環境が自動的にセットアップされ、ビルド後に生成されたバイナリがラズベリーに送信されます。
問題は、FTP転送でバイナリモードの代わりにASCIIモードを使用することでした。今日はSFTP(SSH)を使用することを好みます。ありがとうございます。
私の推奨事項はここにあります http://hertaville.com/2012/09/28/development-environment-raspberry-pi-cross-compiler/ 彼はEclipseの使用方法を説明するのに良い仕事をしていますHelloWorld.cppをコンパイルし、ダウンロードして、RaspberryPiボードで実行します。見てみな。
ツールチェーンは次の場所で試すことができます: https://github.com/kallaballa/Raspberry-GCC-4.7.
これは、gnueabiを使用したhardfpを備えたarmv6用のビルド済みのgcc-4.7.3ツールチェーンです。私はそれを使って、ラズベリアンターゲットのc ++ 11をクロスコンパイルしています。
Linuxx86_64ホストでのみ機能することに注意してください。
VisualStudioとVisualGDBプラグインを使用して、RaspberryPi用のクロスコンパイラをダウンロードできます。その後、ssh接続を作成し、プログラムをRaspberryPiにリモートでデプロイすることもできます。