wake-up-neo.net

Cross-Compilation für Raspberry Pi in GCC. Wo soll man anfangen?

TL/DR : Wo finde ich weitere Informationen zum Erstellen einer GCC 4.7.0-Cross-Compiling-Toolchain für ARM (gnueabi) -Plattform (soll auf einem Raspberry Pi-Gerät ausgeführt werden)?

Ich habe gerade einen brandneuen Raspberry Pi bekommen und bin sehr gespannt darauf, ihn zu programmieren. Ich habe es geschafft, die GCC-Toolchain zu installieren (ich verwende das Arch Linux-System-Image) und einige grundlegende Programme zu kompilieren, die alle einwandfrei funktionieren.

Ich habe auch versucht, die Boost-Bibliotheken zu kompilieren, da ich sie in meinen Projekten häufig verwende und alles unter Befolgung der Anweisungen (./bootstrap.sh + ./b2) Gut zu funktionieren schien, mit Ausnahme der Tatsache, dass die Kompilierung durchgeführt wurde war schmerzlich langsam. Ich habe es für ein paar Stunden eingeschaltet gelassen, aber es ist kaum über die ersten Quelldateien hinausgekommen. Nachdem ich es für die Nacht laufen ließ, stellte ich fest, dass der Erstellungsprozess wegen RAM Mangel abgebrochen wurde.

Ich vermute also, dass Rasp Pi einfach zu schwach ist, um so etwas wie Boost zu kompilieren. Cross-Compilation kommt mir also in den Sinn. Ich finde es jedoch verwirrend, obwohl es eine Menge Informationen zu ARM= cross compilation online gibt. Wo fängt man überhaupt an?

Ich habe eine aktuelle GCC-Version (4.7.0) auf meinem Raspberry Pi, daher möchte ich im Idealfall mit derselben Version crosskompilieren. Woher bekomme ich die GCC 4.7.0-Toolchain für ARM? (Ich werde auf x86 CentOS 6.2 kompilieren)

Bearbeiten:

Ich habe nicht benötigten GPU-Speicher freigegeben und eine 4-GB-Swap-Partition auf einem USB-Laufwerk eingerichtet, während sich Build-Dateien auf einer NFS-Freigabe befinden. Boost wird jetzt viel schneller kompiliert und ist daher überschaubar. Ich möchte dennoch wissen, wie ich eine GCC 4.7-Toolchain für die Cross-Kompilierung auf meinem x86-PC einrichten kann, da ich viel kompilieren möchte und ich möchte, dass es so schnell wie möglich ist.

Edit 2:

Da GCC 4.7.0 relativ neu ist, scheint es keinen vorgefertigten Cross-Compiler zu geben (i386-> ARM). Ich werde wahrscheinlich selbst eine bauen müssen, was keine einfache Aufgabe zu sein scheint (ich habe es versucht und bin gescheitert). Kennt jemand ein Tutorial zum Erstellen eines GCC-Cross-Compilers, hoffentlich für eine der neuesten Versionen?

Ich habe es mit diesem großartigen Shell-Skript (das beim Erstellen eines Compilers mit demselben Arch großartig funktioniert hat) versucht, und ich habe binutils und die Voraussetzungen für GCC erfolgreich erstellt, aber dann schlug die GCC-Erstellung weiterhin fehl mit vielen kryptischen Fehlern. Ich bin hier wirklich verloren und würde mich sehr über Ihre Hilfe freuen.

GCC auf Raspberry Pi wurde mit konfiguriert

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

Edit 3:

Ich habe es geschafft, eine 4.7-GCC-Toolchain für ARM (yay!) Mit diesem Shell-Skript zu erstellen, wie es der Benutzer in den Kommentaren vorgeschlagen hat. Ich habe auch newlib und libstdc++ mit dieser Artikel als Leitfaden Die Toolchain funktioniert einwandfrei, aber wenn ich die ausführbare Datei auf meinem Raspberry Pi starte, schlägt sie mit Illegal instruction fehl könnte die ursache dafür sein?

52
Tibor

Ich habe diese Anleitung gefunden Wie man einen Cross-Compiler für Ihren Raspberry Pi erstellt . Es ist ein großartiger Spaziergang mit einem crosstool-ng Tool, das die Konfiguration eines compilerübergreifenden Builds vereinfacht VIEL (es hat eine Nice-Curses-basierte Oberfläche) und unterstützt GCC 4.7.

Scheint großartig zu funktionieren!

24
Tibor

http://github.com/dwelch67/raspberrypibuildgcc directory Es gibt ein Skript für 4.7 gcc/gnu und 3.0 clang/llvm. gnu man aus dem script im mpx-projekt bei opencores abgeleitet, habe ich gdb rausgeschnitten und libgcc, glibc etc auf einen compiler runtergenommen. wenn du willst, dass andere Sachen Arm für Mips ausschneiden und einfügen.

4
old_timer

Hier finden Sie eine Schritt-für-Schritt-Anleitung Erstellen des Raspberry Pi-Cross-Compilers unter Windows . Der Grund, warum Sie bekommen Illegal Instruction error is latest Raspbian ist hardfp-fähig und benötigt entsprechende Patches, damit gcc und eglibc hardfp unterstützen. Andernfalls wird der generierte Code unterschiedliche ABI verwenden, d. H. Funktionsargumente in unterschiedlichen Registern übergeben, sodass er zur Laufzeit abstürzt.

Auch eine falsche Konfiguration von GCC für ARMv7 (Raspebby Pi ist ARMv6) kann zu Illegal Instruction Error. Achten Sie darauf, --with-Arch=armv6 Option bei der Konfiguration von GCC.

Der oben verlinkte Leitfaden basiert jedoch auf GCC 4.6.3. Aber ich denke, es sollte auch mit GCC 4.7 funktionieren.

4
Mikhail Kupchik

Ich konnte keinen 4.7 gcc finden, nur einen 4.6. Zur Information habe ich den Pi-Kernel auf einem relativ alten Ubuntu-Rechner (1 GHz, 768 MB RAM) kompiliert, wobei ich die Richtlinien auf dieser Seite befolge: Kernel-Kompilierung

Der Bau dauerte etwa 90 Minuten, verglichen mit den 6 Stunden, die der Pi voraussichtlich in Anspruch nehmen würde. Der Kernel läuft gut auf dem Pi. Vielleicht können Sie diese Richtlinien anpassen, um andere Projekte auf Ihrem x86-Linux-Computer zu kompilieren.

2
NickT

Das Dockcross-Projekt ist ein guter Ausgangspunkt für eine vollständig desodorierte Werkzeugkette, die Sie nicht nur für Pi, sondern für alles andere bauen können. Hier sind die Befehle:

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'

Es hat auch cmake eingebaut.

1
Zeev Glozman

Versuchen Sie es mit der Raspberry-GCC-4.7. Toolchain.

Es ist eine vorgefertigte gcc-4.7.3-Toolchain für armv6 mit hardfp unter Verwendung von gnueabi. Ich benutze es, um C++ 11 für ein Raspberrian-Ziel zu kompilieren.

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

1
kallaballa

Sie können meine Open-Sourcing-vorgefertigten/vorkompilierten GCC Cross & Native Compiler-Binärdateien für Raspberry Pi von diesem aktuellen GitHub-Repository ausprobieren:

Dieses Projekt enthält den UpToDate-Satz von vorkompilierten/vorgefertigten Raspberry Pi GCC Cross & Native Compilers-Binärdateien, wodurch Sie jede Menge Zeit sparen (keine Kompilierung oder Fehlerbehandlung erforderlich). Einfach extrahieren, verknüpfen und genießen Sie die vollständige GCC (Raspberry Pi) -Funktionalität in Ihrem Computer. Sie können seine nativen Compiler für Raspberry Pi verwenden (Kann zusammen mit dem alten und langsamen 6.3.0 GCC verwendet werden) oder den Cross-Compiler auf einem beliebigen Linux-Computer (getestet auf neuestem Ubuntu/bionic x64) verwenden, um Programme für Ihren Raspberry Pi zu kompilieren . Alle diese Compiler-Binärdateien sind Raspberry Pi-Hardware, die für eine verbesserte Gesamtleistung optimiert wurde.

Unterstützte GCC-Versionen:

  • GCC 6.3.0
  • GCC 7.4.0
  • GCC 8.2.0
  • GCC 8.3.0

Unterstützte Himbeer-Pis:

  • Alle Raspberry Pi Versionen/Modelle werden derzeit unterstützt.
  • Alle anderen ARM Geräte mit ähnlichen Hardware-Konfigurationen funktionieren möglicherweise ebenfalls.

Unterstützte Umgebungen:

  • Cross-Compiler: Derzeit werden alle Linux Distros (x32/x64) unterstützt.
  • Native-Compiler: Alle Raspberry Pi Versionen/Modelle mit Raspbian OS werden unterstützt. Andere Betriebssysteme funktionieren möglicherweise/möglicherweise nicht.

Unterstützte Sprachen:

  • C++
  • C
  • Fortran
0
abhiTronix

Wie Sie bereits bemerkt haben, ist das Erstellen des Raspberry Pi selbst langsam, aber zuverlässig (da es nicht übergreifend kompiliert wird), sofern Ihnen nicht der Arbeitsspeicher ausgeht. Vielleicht ist es möglich, die Speicher- und Swap-Einstellungen zu optimieren, um größere Builds zu ermöglichen (wenn nicht schnell). Ich weiß in den Foren, dass die Leute über das Speichern von Root-Partitionen auf SD, Benutzerpartitionen auf USB-Laufwerken sprechen, und natürlich wird es wahrscheinlich einen Unterschied machen, eine schnelle (Klasse 6 oder besser) SD-Karte zu bekommen. Es ist möglich, dass sich mit der Zeit die Kompilierungsleistung verbessert, wenn sich die Software verbessert. Oder vielleicht hat Raspberry Pi 2 einen verbesserten Chipsatz und mehr RAM. :-)

0
mlepage