Wie erstelle ich eine GCC 4.7-Toolchain für das Cross-Compilieren?

82

Diese Frage habe ich bereits zu Stack Overflow gestellt, aber ich würde gerne wissen, ob es jemandem gelungen ist, eine GCC 4.7-Toolchain für ARM-Cross-Compilation (für einen x86 / x86-64-Linux-Host) zu erstellen. Es gibt viele Anweisungen zum Erstellen von GCC aus dem Quellcode und viele verfügbare Cross-Compiler für GCC-Versionen vor 4.7, nur nicht die neueste.

Das Kompilieren auf Rasp Pi selbst funktioniert einwandfrei, ist jedoch für praktische Zwecke etwas zu langsam.

Ich bin gespannt auf das Kompilieren und möchte die neuesten und besten Tools verwenden.

tlhIngan
quelle
Dies scheint in etwa das zu sein, was ich ebenfalls tun muss. Wir entwickeln für ARM5 mit Arch Linux. Die Entwicklung läuft unter Ubuntu Linux 10.04 LTS (heute, vielleicht aktualisieren wir das morgen, ich weiß es noch nicht). Gegenwärtig wird GCC 4.4 ausgeführt, aber die Dinge, die ich tun muss, sind hilfreich, wenn GCC 4.7 (Minimum) nicht erforderlich ist, wenn GCC 4.8 (sofern wir es verwalten können) für C ++ 11-Sprachfunktionen. Anscheinend sind alle für ARM verfügbaren Toolketten (5 oder etwas anderes) überholt. Ist es möglich, eine Cross-Compiler-Toolkette aus dem Quellcode zu erstellen und das von uns gewünschte GCC zu unterstützen?
Mwpowellhtx
Ich habe ein kleines Problem im zweiten Schritt. Tatsächlich habe ich die Befehle ./configure und make ausgeführt. Alles funktioniert gut. aber wenn ich "install" getippt habe, erhalte ich die Fehlermeldung: install: missing file operand
Siehe auch: raspberrypi.stackexchange.com/q/14587/5538 Ich habe das als Betrug abgeschlossen, aber ich dachte, es lohnt sich, es hier zu verlinken, weil die akzeptierte Antwort dort in beträchtlichen Details geht, die hier nicht enthalten sind.
Goldlöckchen

Antworten:

60

Ich habe diese Anleitung gefunden. Wie man einen Cross-Compiler für den Raspberry Pi erstellt . Es ist eine großartige Einführung in die Verwendung eines crosstool-ngTools, das die Konfiguration eines compilerübergreifenden Builds vereinfacht. VIEL (es hat eine schöne, auf Flüchen basierende Oberfläche) und es unterstützt GCC 4.7.

Ich bin diesen Schritten gefolgt und habe einen 4.7-Cross-Compiler erfolgreich erstellt.

Voraussetzungen: Die folgenden Pakete sind erforderlich: bison , flex , gperf , gawk , libtool , automake , g ++. Stellen Sie sicher, dass diese installiert sind, bevor Sie fortfahren .

  1. Erster Download crosstool-ngvon hier (ich habe Version 1.15.2 verwendet).
  2. Entpacken Sie die Distribution und tun ein ./configure/ make/install
  3. Erstellen Sie irgendwo im Dateisystem ein neues Verzeichnis, in das Sie es einbauen cdkönnen.
  4. Rennen ct-ng menuconfig. Sie erhalten eine Reihe von Menüs, mit denen Sie Ihren Build konfigurieren können.
  5. Gehen Sie in Pfade und andere Optionen. Aktivieren Sie Testfunktionen, die als EXPERIMENTELL markiert sind.
  6. Wählen Sie ein geeignetes Präfixverzeichnis . Dies ist das Verzeichnis, in das Ihr Compiler und Ihre Bibliotheken installiert werden (grundsätzlich ist alles in Ordnung, stellen Sie nur sicher, dass das Verzeichnis leer ist).

    • HINWEIS: Es ist auch wichtig, dass Sie Schreibzugriff auf den ausgewählten Ordner haben
  7. Gehen Sie auf die Zieloptionen Menü.

    • Zielarchitektur: Arm
    • Endianness: Little Endian
    • Zeuge: 32-Bit
  8. Möglicherweise möchten Sie auch den Gleitkomma-Parameter auf softfp setzen (siehe dies für weitere Informationen), aber hardfp ist besser für Raspbian geeignet.

  9. Gehen Sie zum Betriebssystem- Menü und ändern Sie das Ziel-Betriebssystem in Linux .
  10. Gehen Sie zum C-Compiler- Menü und wählen Sie die gcc-Version 4.7.0 (der Artikel empfiehlt Linaro, aber ich habe es geschafft, dass es mit Vanille-gcc funktioniert). Wählen Sie außerdem weitere Sprachen aus, die Sie kompilieren möchten (C ++, Fortran, ...)
  11. Gehen Sie zum C-Library- Menü und wählen Sie eines aus. Der Standard ist eglibc, aber dieser hat für mich nicht gut funktioniert, also habe ich glibc (die neueste Version) verwendet.

    • HINWEIS: Während des Erstellungsschritts 13 kann eglibc möglicherweise nicht erstellt werden, wenn Subversion nicht installiert ist, da die Quelle nicht aus dem Repository abgerufen werden kann
    • HINWEIS: eglibc ist ab Version 1.21.0 nicht mehr enthalten, da es noch nicht entwickelt wurde. Siehe So long to eglibc . Verwenden Sie standardmäßig glibc . crosstool-ng
  12. Beenden Sie das Konfigurationstool, während Sie Ihre Änderungen speichern.
  13. Führen Sie ct-ng buildin demselben Verzeichnis. Warten Sie eine Weile (in meinem Fall ca. 45 Minuten) und Ihr Cross-Compiler sollte bereit sein.

Scheint großartig zu funktionieren!

Benutzer13
quelle
Wow, 45 Minuten sind eine lange Zeit. Wie schnell ist Ihr System? Ich warte jetzt
Jivings
Naja, vielleicht war es ein bisschen weniger, aber es muss zuerst alle Voraussetzungen kompilieren und nach bintools und gcc auch libc und libstdc ++, also klingt 45 min für mich vernünftig.
Können wir Details zur ordnungsgemäßen Installation hinzufügen und den Pfad aktualisieren, nachdem wir ihn getestet haben?
Alex Chamberlain
2
Außerdem denke ich, wir sollten hardfp verwenden, da das RPi dies unterstützt.
Alex Chamberlain
Möglicherweise, aber IIRC, ist der GCC des Arch mit Softfp konfiguriert. Ich habe jetzt keine Zeit, dies zu testen, aber ich habe das Wiki der Antwort-Community erstellt. Sie können es also jederzeit verbessern.
19

Ich bin gespannt auf das Kompilieren und möchte die neuesten und besten Tools verwenden.

Tatsächlich müssen die neuesten und besten Tools nicht selbst erstellt werden. Im GitHub-Repository des Raspberry Pi Tools finden Sie die Toolchains X86_64und x686für die kompilierungsübergreifende Software.

Ich empfehle, die x86-linux64-cross-arm-linux-hardfpToolchain zu verwenden, da diese für Hard Floating Point kompiliert wird, was zu einem viel schnelleren System führt.

$ arm-bcm2708hardfp-linux-gnueabi-gcc --version

arm-bcm2708-linux-gnueabi-gcc-4.5.1 (Broadcom-2708) 4.5.1
Copyright (C) 2010 Free Software Foundation, Inc.

Hinweis: Wenn Sie einen vorhandenen Kernel verwenden, müssen Sie die Toolchain verwenden, die dem Kernel entspricht. HardFP-Anwendungen funktionieren auf einem SoftFP-Kernel nicht.


Um die Toolchain zu verwenden, checken Sie einfach das Repository aus:

git clone https://github.com/raspberrypi/tools.git --depth 1

Der --depthParameter bedeutet, dass Sie nicht warten müssen, bis der Repository-Verlauf ebenfalls heruntergeladen wurde (da wir ihn nicht verwenden).

Fügen Sie dann die Binärdateien zu Ihrer PATH-Variablen hinzu:

export PATH=~/tools/arm-bcm2708/x86-linux64-cross-arm-linux-hardfp/bin:$PATH

Oder um den PFAD beizubehalten:

echo "export PATH=~/tools/arm-bcm2708/x86-linux64-cross-arm-linux-hardfp/bin:$PATH" >> ~/.bashrc
source ~/.bashrc

Um mit der Werkzeugkette zu kompilieren, können Sie jetzt den CROSS_COMPILEParameter hinzufügen . Zum Beispiel beim Laufen make:

make CROSS_COMPILE=arm-bcm2708hardfp-linux-gnueabi- 

Oder um dies zu vereinfachen, können Sie die Variable bashrcerneut speichern :

echo "export TARGET=arm-bcm2708hardfp-linux-gnueabi" >> ~/.bashrc
source ~/.bashrc

Und jetzt benutze die Variable beim Kompilieren:

make CROSS_COMPILE=${TARGET}
Jivings
quelle
1
Dies scheint gcc-4.5.1 zu sein.
@Tibor Ist das schlimm?
Jivings
@Jivings Es beantwortet die Frage total nicht!
Alex Chamberlain
1
Ich lehne die Abstimmungen ab. @AlexChamberlain Dies ist eine wertvolle Alternative zum zeitaufwändigen Erstellen einer eigenen Toolchain.
Jivings
2
@Jivings: Das ist sehr hilfreich. Inzwischen ist es gcc4.7.1 (das beste, das ich je hatte) und Floating Point funktioniert sofort. Mit Chris 'ursprünglicher Beschreibung, die Tibor gepostet hat, konnte ich Fließkommazahlen nicht funktionieren lassen. Vielen Dank.
4

Beachten Sie, dass ich beim Erstellen der Toolchain mit ct-ng on centos 6.3 auf einem 64-Bit-System die Option zum statischen Verknüpfen von libstdc ++ deaktivieren musste, da das statische Verknüpfen auf der Plattform (anscheinend) nicht unterstützt wurde.

Auch wenn es großartig wäre, die vorgefertigte Toolchain aus dem Git-Repository zu verwenden, scheint diese Kette auf Centos 6.3 nicht zu funktionieren - wahrscheinlich, weil sie für ein moderneres System oder so etwas gebaut wurde. Ich habe nicht wirklich versucht, das runterzureißen.

Shane McCarron
quelle
3

Diese Anleitung kann hilfreich sein.

Es hat mir geholfen, meine zum Laufen zu bringen. Ich habe auch einige Kommentare zum Thema Tuning hinzugefügt.

Dean Matsen
quelle
3

Wenn Sie von einem schnellen Host für das Kompilieren von Dingen für Ihr RPI profitieren möchten, empfehle ich, in einer Cross-Umgebung über Chroot und QEMU zu arbeiten. Dies ersetzt übrigens einen Cross-Compiler ohne Probleme.

Richten Sie einfach eine Debian-Cross-Umgebung mit deboostrap / multistrap ein

(siehe Kapitel QEMU / Debootstrap-Ansatz) und fertig.

Sparkie
quelle
3

Für den Fall, dass Sie eine Cross-Kompilierung von OS X durchführen möchten: Hier ist der großartige Artikel (und der einzige, der im Web funktioniert, den ich gefunden habe).

Das Beste ist, dass der Autor eine vollständige vorkompilierte Toolchain zur Verfügung stellt , sodass Sie nur ein dmg-Image herunterladen, entpacken und einbinden müssen. Und fertig, Sie sind bereit für das Cross-Compilieren.

Anton Matosov
quelle
2

Wenn Sie Ubuntu 64-Bit-Edition und die Tools von Raspberry Pi SVN installiert haben und den Fehler erhalten:

-bash: /home/I/toolchain/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-c++: 
No such file or directory

Renn einfach:

sudo apt-get install ia32-libs
Raubvogel
quelle
1

Die Carlson-Minot Inc. bietet eine vorgefertigte Toolchain für Bare-Metal- und GNU / Linux-ARM-Ziele. Diese Toolchain basiert auf der Mentor Graphics Sourcery Lite-Toolchain mit Korrekturen und Anpassungen für die Erstellung auf OS X. Siehe

Anton Matosov
quelle