2012-06-26 16 views
11

Mit einem RaspBerry Pi und von meinem Computer versuche ich eine einfache HalloWelt, die in C++ geschrieben ist, zu kompilieren. Ich benutze Code Sourcery Toolchain für Linux zu kompilieren.Cross-Compiling für RaspBerry Pi

Wenn die helloworld Binärkopie von TFTP Himbeer- und es Ausführungsberechtigungen mit chmod geben, wird der nächste Fehler angezeigt:

„Illegal instruction“

Wenn eine ‚Datei‘ über binäre machen erhalte ich: "Himbeer: ELF 32-Bit LSB ausführbare Datei, ARM, Version 1 (SYSV), statisch verbunden, abisoliert"

Dies ist, weil ich "-static -static-libstdC++" beim Linken verwendet.

Wenn ich nicht statisch Verknüpfung verwenden, wird der Fehler ist: "Segmentation fault"

Der Code:

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

Wie konnte ich mein Programm in einem richtigen Weg kompilieren und ausführen? Danke.

+0

bitte posten Hallo Welt Quelle und eine Demontage, wenn die Binärdatei zu bauen. –

+0

Ich dachte einer der Vorteile von RaspberryPi ist, dass es ein komplettes Betriebssystem ausführt, Sie müssen nicht kompilieren. –

+1

Ja, aber das Kompilieren auf einem Raspberry ist langsamer als das Kompilieren in meinem Core i5. Aber ich möchte auch mit meiner geliebten Eclipse programmieren. –

Antwort

16

This page informiert Sie ausführlich darüber, wie Sie eine Cross-Compiling-Umgebung für Ihren Raspberry Pi einrichten. Viel Glück!

+0

Danke. Crosstools-ng funktioniert richtig für mich. –

+0

@CesarOrtiz Wenn dies funktioniert, sollten Sie diese Antwort akzeptieren. – TheLukeMcCarthy

6

Der Grund, warum erhalten Sie Segmentation fault Fehler ist ABI anders. Raspberry Pi verwendet beim Ausführen von Raspbian linux-arm-gnueabihf ABI, das Hardfp- und VFP-Unterstützung in Hardware annimmt (was in der ARMv6-Umgebung selten ist), erfordert also einige zusätzliche Patches für GCC und EGLIBC (diese Patches können im Raspbian-Repository gefunden werden).

Ihre code-Sourcery Cross-Toolchain hat höchstwahrscheinlich diese Patches nicht, daher wird ein anderer ABI verwendet (linux-arm-gnueabi), daher der Absturz zur Laufzeit (statisches Linken funktioniert, weil Kernel ABI nicht von hardfp/softfp abhängt).

Ein weiterer möglicher Grund, warum Sie Illegal Instruction Fehler erhalten, ist Code Sourcery Cross-Toolchain für ARMv7 konfiguriert und Raspberry Pi ist ARMv6. In diesem Fall führt jedoch sowohl die statische als auch die dynamische Verknüpfung zum gleichen Fehler.

Here is a step-by-step guide how to build Raspberry Pi cross compiler in Windows, beide hardfp/softfp ABI-Versionen. Der resultierende Cross-Compiler unterstützt C++ und ist nicht von der cygwin-Laufzeitbibliothek (cygwin1.dll) abhängig.

0

Das Problem war, ASCII-Modus anstelle von Binärmodus in meinen FTP-Übertragungen zu verwenden. Heute bevorzuge ich SFTP (SSH). Danke.

1

könnten Sie versuchen, die Werkzeugkette an: https://github.com/kallaballa/Raspberry-GCC-4.7.3

Es ist eine vorgefertigte gcc-4.7.3 Werkzeugkette für ARMv6 mit hardfp gnueabi verwenden. Ich verwende es, um C++ 11 für ein raspberrian Ziel zu kompilieren.

Bitte beachten Sie, dass es nur auf Linux x86_64 Hosts funktioniert.

0

Mit Visual Studio und Visual GDB Plugin können Sie den Cross Compiler für Raspberry Pi herunterladen.Danach können Sie eine SSH-Verbindung erstellen und Sie können Ihr Programm auch remote in Raspberry Pi bereitstellen.

3

Ich empfehle biicode versuchen würde, setzt sie automatisch die Cross-Compiler-Umgebung für Sie und sendet Binärdateien auf die Himbeere erzeugt nach

+0

der Link ist down. – Hannes

+0

behoben, danke fürs Erzählen – hithwen