Ich versuche, Cross-Compiling für Raspberry Pi auf meinem Ubuntu-Computer zum Laufen zu bringen.
Bei meinen ersten Versuchen habe ich den Arm-Linux-Gnueabi-Compiler verwendet, der im Ubuntu-Repo verfügbar ist. Ich habe das zum Laufen gebracht. Ich konnte alle meine Abhängigkeiten erstellen und den Cross-Compiler in meinem cmake-Projekt verwenden.
Ich glaube jedoch, dass ich die hf-Version verwenden sollte, also wechselte ich zu arm-linux-gnueabihf. Dann wurde mir klar, dass dies mit Raspberry Pi nicht funktioniert, da es armv6 ist.
Nach einigem Googeln fand ich dann die vorgefertigte Toolchain von GitHub .
Ich habe die Toolchain heruntergeladen, aber ich verstehe nicht wirklich, wie man sie "installiert". Ich habe die Dateien in mein Home-Verzeichnis extrahiert. Die Verzeichnisstruktur sieht folgendermaßen aus:
/gcc-linearo-arm-linux-gnueabihf-raspbian
/arm-linux-gnueabihf
/bin
(contains g++, gcc, etc)
/lib
(contains libstdc++ library)
/bin
(contains arm-linux-gnueabihf-g++, arm-linux-gnueabihf-...)
/lib
(gcc lib stuff)
Wenn ich das Verzeichnis in den Ordner INNER bin wechsle, kann ich problemlos ein Testprogramm vom Terminal aus kompilieren.
~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/
arm-linux-gnueabihf/bin$ g++ test.cpp -o test
Ich habe dann versucht, ein Testprogramm im Ordner OUTER bin zu kompilieren, das die vorangestellten Versionen der Tools enthält.
~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin$
arm-linux-gnueabihf-g++ test.cpp -o test
Wenn ich jedoch versuche, den Compiler jetzt (von außerhalb des inneren bin-Verzeichnisses) zu verwenden, kann er die gemeinsam genutzte Bibliothek libstdc ++, die mit der Toolchain geliefert wird, nicht finden:
arm-linux-gnueabihf-gcc: error while loading shared libraries:
libstdc++.so.6: cannot open shared object file: No such file or directory.
Außerdem möchte ich den Compiler verwenden können, ohne zum bin-Verzeichnis navigieren zu müssen. Also habe ich versucht, das Verzeichnis OUTER bin (da ich die vorangestellten Versionen haben möchte) und beide lib-Verzeichnisse zu meinem PATH hinzuzufügen:
export PATH=$PATH:~/tools/.../bin
export PATH=$PATH:~/tools/.../lib
export PATH=$PATH:~/tools/.../.../lib
Dies führt jedoch zu demselben Fehler. Wie soll ich die Toolchain "installieren", damit ich die Toolchain von überall aus verwenden kann, genau wie ich es kann, wenn ich die Cross-Compiler aus dem Ubuntu-Repo verwende?
quelle
Antworten:
Ich werde versuchen, dies als Tutorial für Sie zu schreiben, damit es leicht zu befolgen ist.
HINWEIS: Dieses Tutorial funktioniert nur für ältere Raspbian-Bilder. Für das neuere Raspbian, das auf Debian Buster basiert, lesen Sie die folgenden Anleitungen in diesem Thread: https://stackoverflow.com/a/58559140/869402
Voraussetzungen
Bevor Sie beginnen, müssen Sie sicherstellen, dass Folgendes installiert ist:
Lassen Sie uns einen Kuchen kreuzen!
Beginnen Sie mit dem Erstellen eines Ordners in Ihrem Home-Verzeichnis mit dem Namen
raspberrypi
.Gehen Sie in diesen Ordner und öffnen Sie den oben erwähnten Ordner mit den GESAMTEN Werkzeugen:
Sie wollten die folgenden 3 verwenden
gcc-linaro-arm-linux-gnueabihf-raspbian
, wenn ich nicht falsch gelesen habe.Gehen Sie in Ihr Home-Verzeichnis und fügen Sie hinzu:
bis zum Ende der benannten Datei
~/.bashrc
Jetzt können Sie sich entweder abmelden und wieder anmelden (dh Ihre Terminalsitzung neu starten) oder
. ~/.bashrc
in Ihrem Terminal ausführen , um denPATH
Zusatz in Ihrer aktuellen Terminalsitzung aufzunehmen.Stellen Sie nun sicher, dass Sie auf den Compiler zugreifen können
arm-linux-gnueabihf-gcc -v
. Sie sollten so etwas bekommen:Aber hey! Ich habe das gemacht und die Bibliotheken funktionieren immer noch nicht!
Wir sind noch nicht fertig! Bisher haben wir nur die Grundlagen gemacht.
raspberrypi
Erstellen Sie in Ihrem Ordner einen Ordner mit dem Namenrootfs
.Nun müssen Sie das gesamte kopieren
/lib
und/usr
Verzeichnis in diesem neu erstellten Ordner. Normalerweise rufe ich das RPI-Bild auf und kopiere es über rsync:wo
192.168.1.PI
wird durch die IP Ihres Raspberry Pi ersetzt.Jetzt müssen wir eine
cmake
Konfigurationsdatei schreiben . Öffnen Sie~/home/raspberrypi/pi.cmake
in Ihrem bevorzugten Editor und fügen Sie Folgendes ein:Jetzt sollten Sie in der Lage sein, Ihre
cmake
Programme einfach durch Hinzufügen dieses zusätzlichen Flags zu kompilieren :-D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake
.Verwenden eines Beispiels für eine cmake-Hallo-Welt :
quelle
ia32-libs
Paket ist unter Ubuntu 13.10 nicht verfügbar. Ich habelibc6-i386 lib32z1 lib32stdc++6
stattdessen verwendet.Erstellen für neuere Raspbian Debian Buster-Bilder und ARMv6
Die Antwort von @Stenyg funktioniert nur für ältere Raspbian-Bilder. Das kürzlich veröffentlichte Raspbian basierend auf Debian Buster erfordert eine aktualisierte Toolchain:
In Debian Buster wurden der gcc-Compiler und glibc auf Version 8.3 aktualisiert. Die Toolchain in
git://github.com/raspberrypi/tools.git
basiert weiterhin auf der älteren gcc 6-Version. Dies bedeutet, dass die Verwendunggit://github.com/raspberrypi/tools.git
zu vielen Kompilierungsfehlern führt.Dieses Tutorial basiert auf der Antwort von @Stenyg. Neben vielen anderen Lösungen im Internet unterstützt dieses Tutorial auch ältere Rasperry Pi (A, B, B +, Zero ), die auf der ARMv6-CPU basieren. Siehe auch: GCC 8 Cross Compiler gibt die ausführbare ARMv7-Datei anstelle von ARMv6 aus
Richten Sie die Toolchain ein
Es gibt kein offizielles Git-Repository mit einer aktualisierten Toolchain (siehe https://github.com/raspberrypi/tools/issues/102 ).
Ich habe ein neues Github-Repository erstellt, das das Erstellen und Vorkompilieren von Toolchains für ARMv6 auf der Basis von GCC8 und neueren Versionen umfasst:
https://github.com/Pro/raspi-toolchain
Wie in der Readme-Datei des Projekts erwähnt, sind dies die Schritte, um die Toolchain abzurufen. Sie können es auch selbst erstellen (weitere Informationen finden Sie in der README-Datei).
/opt/cross-pi-gcc
da sie nicht ortsunabhängig ist.Du bist fertig! Die Toolchain ist jetzt in
/opt/cross-pi-gcc
Fügen Sie optional die Toolchain zu Ihrem Pfad hinzu, indem Sie Folgendes hinzufügen:
bis zum Ende der benannten Datei
~/.bashrc
Jetzt können Sie sich entweder abmelden und wieder anmelden (dh Ihre Terminalsitzung neu starten) oder
. ~/.bashrc
in Ihrem Terminal ausführen , um denPATH
Zusatz in Ihrer aktuellen Terminalsitzung aufzunehmen.Holen Sie sich die Bibliotheken aus dem Raspberry PI
Um eine Cross-Kompilierung für Ihren eigenen Raspberry Pi durchzuführen, auf dem möglicherweise einige benutzerdefinierte Bibliotheken installiert sind, müssen Sie diese Bibliotheken auf Ihren Host übertragen.
Erstellen Sie einen Ordner
$HOME/raspberrypi
.raspberrypi
Erstellen Sie in Ihrem Ordner einen Ordner mit dem Namenrootfs
.Nun müssen Sie das gesamte kopieren
/lib
und/usr
Verzeichnis in diesem neu erstellten Ordner. Normalerweise rufe ich das RPI-Bild auf und kopiere es über rsync:wo
192.168.1.PI
wird durch die IP Ihres Raspberry Pi ersetzt.Verwenden Sie CMake, um Ihr Projekt zu kompilieren
Um CMake anzuweisen, Ihre eigene Toolchain zu verwenden, benötigen Sie eine Toolchain-Datei, die die Compilereinstellungen initialisiert.
Diese Toolchain-Datei erhalten Sie hier: https://github.com/Pro/raspi-toolchain/blob/master/Toolchain-rpi.cmake
Jetzt sollten Sie in der Lage sein, Ihre
cmake
Programme einfach zu kompilieren, indem Sie dieses zusätzliche Flag hinzufügen:-D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake
und die richtigen Umgebungsvariablen festlegen:Ein Beispiel für eine Hallo-Welt finden Sie hier: https://github.com/Pro/raspi-toolchain/blob/master/build_hello_world.sh
quelle
--safe-links
Streit/opt/cross-pi-gcc
?Ich konnte nicht den Compiler (get -
x64
Version) die verwenden ,sysroot
bis ich hinzugefügtSET(CMAKE_SYSROOT $ENV{HOME}/raspberrypi/rootfs)
zupi.cmake
.quelle
Für Windows - Host, möchte ich sehr empfehlen dieses Tutorial: :
Nicht mehr, nicht weniger!
Vorgefertigte GNU-Toolchains für Himbeere, Beaglebone, Cubieboard, AVR (Atmel) und mehr
quelle
Sie können auch Clang verwenden . Früher war es schneller als GCC, und jetzt ist es eine ziemlich stabile Sache. Es ist viel einfacher, Klirren aus Quellen zu bauen ( Sie können während des Bauprozesses wirklich eine Tasse Kaffee trinken ).
Zusamenfassend:
Kompilieren Sie Ihren Code:
Optional können Sie ältere Arm-Linux-Gnueabihf-Binutils verwenden. Dann können Sie am Ende das Flag "-fuse-ld = lld" entfernen.
Unten ist meine cmake Toolchain-Datei.
toolchain.cmake
quelle
Ich konnte QT5 mit keiner der (ziemlich veralteten) Toolchains von git kompilieren: //github.com/raspberrypi/tools.git. Das Konfigurationsskript schlug weiterhin mit dem Fehler "Architektur konnte nicht ermittelt werden" und mit massiven Pfadproblemen für Include-Verzeichnisse fehl. Was für mich funktioniert hat, war die Verwendung der Linaro-Toolchain
in Kombination mit
Wenn die Symlinks der Sysroot nicht behoben werden, führt dies zu undefinierten Symbolfehlern, wie hier beschrieben: Ein Fehler beim Erstellen von Qt-Bibliotheken für den Himbeer-Pi Dies ist mir passiert, als ich das Skript fixQualifiedLibraryPaths aus tools.git ausprobiert habe. Alles andere wird ausführlich unter http://wiki.qt.io/RaspberryPi2EGLFS beschrieben . Meine Konfigurationseinstellungen waren:
Dabei ist / usr / local / rasp / sysroot der Pfad meiner lokalen Raspberry Pi 3 Raspbian (Jessie) -Systemkopie und / usr / local / qt5pi der Pfad der kreuzkompilierten QT, die ebenfalls auf das Gerät kopiert werden muss. Beachten Sie, dass Jessie bei der Auswahl Ihrer Toolchain mit GCC 4.9.2 geliefert wird.
quelle
Die erste Frage wurde vor einiger Zeit gestellt und in der Zwischenzeit hat Debian große Fortschritte im Bereich der Unterstützung durch Multiarchen erzielt.
Multiarch ist eine großartige Leistung für die Cross-Compilation!
Kurz gesagt, die folgenden Schritte sind erforderlich, um Multiarch für die Raspbian Jessie-Cross-Kompilierung zu nutzen:
Da dies eine Menge Arbeit ist, habe ich das obige Setup automatisiert. Sie können hier darüber lesen:
Cross Compiling für Raspbian
quelle
Es gibt eine CDP Studio-IDE, die das Cross-Kompilieren und Bereitstellen unter Windows und Linux recht einfach macht. Sie können das Kontrollkästchen für die Himbeer-Toolchain während der Installation aktivieren. (PS. Es hat GPIO- und I2C-Unterstützung, daher wird kein Code benötigt, um auf diese zuzugreifen.)
Die IDE-Demo zur Verwendung von Himbeeren finden Sie hier: https://youtu.be/4SVZ68sQz5U
und Sie können die IDE hier herunterladen: https://cdpstudio.com/home-edition
quelle