2012-06-26 50 views
11

RaspBerry Piと私のコンピュータからは、C++で書かれた単純なhelloWorldをクロスコンパイルしようとしています。私は、コンパイルするために、Linux用のCode Sourceryツールチェーンを使用しています。 TFTPによってラズベリーとそれをchmodコマンドで実行権限を与えることのHelloWorldバイナリをコピーするとRaspBerry Piのクロスコンパイル

、次のエラーが表示されます:バイナリの上に「ファイル」を作る場合

「不正な命令」

私が取得: "ラズベリー: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; 
} 

どのように私は、正しい方法で私のプログラムをコンパイルして実行することができますか?おかげさまで

+0

を構築した後、ラズベリーに生成されたバイナリを送り、あなたのバイナリ場合はHello Worldのソースと逆アセンブリを投稿してください。 –

+0

私は、RaspberryPiの利点の1つは、完全なOSを実行することで、クロスコンパイルする必要はないということです。 –

+1

はい、しかし、ラズベリーでのコンパイルは、私のCore i5でのコンパイルよりも遅いです。しかし、私も愛するEclipseでプログラミングしたいと思っています。 –

答えて

16

This pageは、Raspberry Piのクロスコンパイル環境の設定方法を詳しく説明しています。がんばろう!

+0

ありがとうございます。 crosstools-ngが正しく動作します。 –

+0

@CesarOrtizこれがうまくいくなら、あなたはこの答えを受け入れるべきです。 – TheLukeMcCarthy

6

Segmentation faultエラーが発生した理由はABIとは異なります。 Raspbianを実行しているときにRaspbianがlinux-arm-gnueabihf ABIを使用しています(ハードウェアでハードフックとVFPのサポートを前提としています)(ARMv6環境ではまれです)GCCとEGLIBCの追加パッチが必要です(これらのパッチはRaspbianリポジトリにあります)。

あなたのコードソーセージのクロスツールチェーンにはこれらのパッチがない可能性が高いため、実行時にクラッシュする別のABI(linux-arm-gnueabi)を使用しています(カーネルABIはhardfp/softfpに依存しないため

Illegal Instructionエラーが発生する可能性があるもう一つの理由は、ARMv7用に設定されたCode Sourceryのクロスツールチェーンであり、Raspberry PiはARMv6です。しかし、この場合、静的リンクと動的リンクの両方で同じエラーが発生します。

Here is a step-by-step guide how to build Raspberry Pi cross compiler in Windows(両方ともhardfp/softfp ABIバージョン)。結果として得られるクロスコンパイラはC++をサポートし、cygwinランタイムライブラリ(cygwin1.dll)に依存しません。

0

問題は、FTP転送でバイナリモードの代わりにASCIIモードを使用することでした。 今日私はSFTP(SSH)を使うことを好みます。おかげさまで

1

あなたはでツールチェインを試みることができる:それはgnueabiを使用してhardfpを持つARMv6用事前に構築されたのgcc-4.7.3ツールチェーンですhttps://github.com/kallaballa/Raspberry-GCC-4.7.3

。私はラスベリヤのターゲットのためにクロスコンパイルのためにC++ 11を使用しています。

Linux x86_64ホストでのみ動作することにご注意ください。

0

Visual StudioとVisual GDBプラグインを使用すると、ラズベリーパイのクロスコンパイラをダウンロードできます。その後、ssh接続を作成することができますし、ラズベリーパイにリモートでプログラムを展開することもできます。

3

私はbiicodeをしようとお勧めします、それは自動的にあなたのためのクロスコンパイラ環境を設定し、

+0

リンクがダウンしています。 – Hannes

+0

固定、ありがとう – hithwen