13

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;
}

プログラムを正しい方法でコンパイルして実行するにはどうすればよいですか?ありがとう。

4

6 に答える 6

8

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

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

エラーが発生する別の理由Illegal Instructionとして、ARMv7 用に構成された Code Sourcery クロスツールチェーンと Raspberry Pi が ARMv6 であることが考えられます。ただし、この場合、静的リンクと動的リンクの両方で同じエラーが発生します。

これは、 hardfp/softfp ABI バージョンの両方の Windows で Raspberry Pi クロス コンパイラをビルドする方法を順を追って説明したガイドです。結果のクロスコンパイラは C++ をサポートし、cygwin ランタイム ライブラリ (cygwin1.dll) に依存しません。

于 2012-09-26T08:15:06.483 に答える
3

問題は、FTP 転送でバイナリ モードではなく ASCII モードを使用することでした。今日、私は SFTP (SSH) を使用することを好みます。ありがとう。

于 2012-10-18T14:05:31.983 に答える
1

https://github.com/kallaballa/Raspberry-GCC-4.7.3でツールチェーンを試すことができます。

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

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

于 2012-12-21T11:47:06.720 に答える
1

私のお勧めはこちらhttp://hertaville.com/2012/09/28/development-environment-raspberry-pi-cross-compiler/ Eclipse を使用して HelloWorld.cpp をコンパイルし、ダウンロードし、 Raspberry piボードで実行します。見てみな。

于 2013-02-26T05:30:18.577 に答える
0

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

于 2013-12-05T04:49:15.650 に答える