Building für neuere Raspbian Debian Buster-Images und ARMv6
Die Antwort von @Stenyg funktioniert nur für ältere Raspbian-Images. Das kürzlich veröffentlichte Raspbian basierend auf Debian Buster erfordert eine aktualisierte Toolchain:
In Debian Buster wurden der gcc-Compiler und die glibc auf Version 8.3 aktualisiert. Die Toolchain in git://github.com/raspberrypi/tools.git
basiert noch auf der älteren Version gcc 6. Das bedeutet, dass mit git://github.com/raspberrypi/tools.git
wird zu vielen Kompilierfehlern führen.
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 ) basierend auf der ARMv6-CPU. Siehe auch:GCC 8 Cross Compiler gibt statt ARMv6 die ausführbare ARMv7-Datei aus
Toolchain einrichten
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 Build- und vorkompilierte Toolchains für ARMv6 basierend auf GCC8 und neuer enthält:
https://github.com/Pro/raspi-toolchain
Wie in der Readme des Projekts erwähnt, sind dies die Schritte, um die Toolchain zu erhalten. Sie können es auch selbst erstellen (siehe README für weitere Details).
- Laden Sie die Toolchain herunter:
wget https://github.com/Pro/raspi-toolchain/releases/latest/download/raspi-toolchain.tar.gz
- Extrahieren Sie es. Hinweis:Die Toolchain muss sich in
/opt/cross-pi-gcc
befinden da es nicht standortunabhängig ist.
sudo tar xfz raspi-toolchain.tar.gz --strip-components=1 -C /opt
-
Du bist fertig! Die Toolchain befindet sich jetzt in
/opt/cross-pi-gcc
-
Fügen Sie optional die Toolchain zu Ihrem Pfad hinzu, indem Sie Folgendes hinzufügen:
export PATH=$PATH:/opt/cross-pi-gcc/bin
bis zum Ende der Datei mit dem Namen ~/.bashrc
Jetzt können Sie sich entweder abmelden und wieder anmelden (d. h. Ihre Terminalsitzung neu starten) oder . ~/.bashrc
ausführen in Ihrem Terminal, um den PATH
abzurufen Hinzufügen in Ihrer aktuellen Terminalsitzung.
Holen Sie sich die Bibliotheken vom Raspberry PI
Um für Ihren eigenen Raspberry Pi zu kompilieren, auf dem möglicherweise einige benutzerdefinierte Bibliotheken installiert sind, müssen Sie diese Bibliotheken auf Ihren Host übertragen.
Erstellen Sie einen Ordner $HOME/raspberrypi
.In Ihrem raspberrypi
erstellen Sie einen Ordner mit dem Namen rootfs
.
Jetzt müssen Sie den gesamten /lib
kopieren und /usr
Verzeichnis in diesen neu erstellten Ordner. Normalerweise hole ich das rpi-Image hoch und kopiere es über rsync:
rsync -vR --progress -rl --delete-after --safe-links [email protected]:/{lib,usr,opt/vc/lib} $HOME/raspberrypi/rootfs
wobei 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 Compiler-Einstellungen initialisiert.
Holen Sie sich diese Toolchain-Datei hier:https://github.com/Pro/raspi-toolchain/blob/master/Toolchain-rpi.cmake
Jetzt sollten Sie in der Lage sein, Ihren cmake
zu kompilieren Programme einfach durch Hinzufügen dieses zusätzlichen Flags:-D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake
und Setzen der richtigen Umgebungsvariablen:
export RASPBIAN_ROOTFS=$HOME/raspberry/rootfs
export PATH=/opt/cross-pi-gcc/bin:$PATH
export RASPBERRY_VERSION=1
cmake -DCMAKE_TOOLCHAIN_FILE=$HOME/raspberry/Toolchain-rpi.cmake ..
Ein Beispiel für „Hello World“ wird hier gezeigt:https://github.com/Pro/raspi-toolchain/blob/master/build_hello_world.sh
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-Images. Für das neuere Raspbian basierend auf Debian Buster siehe die folgende Anleitung in diesem Thread:https://stackoverflow.com/a/58559140/869402
Voraussetzungen
Bevor Sie beginnen, müssen Sie sicherstellen, dass Folgendes installiert ist:
apt-get install git rsync cmake libc6-i386 lib32z1 lib32stdc++6
Lass uns einen Kuchen kompilieren!
Beginnen Sie damit, in Ihrem Home-Verzeichnis einen Ordner mit dem Namen raspberrypi
zu erstellen .
Gehen Sie in diesen Ordner und ziehen Sie den GESAMTEN Tools-Ordner herunter, den Sie oben erwähnt haben:
git clone git://github.com/raspberrypi/tools.git
Sie wollten die folgenden der 3 verwenden, gcc-linaro-arm-linux-gnueabihf-raspbian
, wenn ich mich nicht verlesen habe.
Gehen Sie in Ihr Home-Verzeichnis und fügen Sie hinzu:
export PATH=$PATH:$HOME/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin
bis zum Ende der Datei mit dem Namen ~/.bashrc
Jetzt können Sie sich entweder abmelden und wieder anmelden (d. h. Ihre Terminalsitzung neu starten) oder . ~/.bashrc
ausführen in Ihrem Terminal, um den PATH
abzurufen Hinzufügen in Ihrer aktuellen Terminalsitzung.
Überprüfen Sie nun, ob Sie auf den Compiler arm-linux-gnueabihf-gcc -v
zugreifen können . Sie sollten etwa Folgendes erhalten:
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/home/tudhalyas/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/../libexec/gcc/arm-linux-gnueabihf/4.7.2/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: /cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.b
uild/src/gcc-linaro-4.7-2012.08/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc-
linux-gnu --target=arm-linux-gnueabihf --prefix=/cbuild/slaves/oort61/crosstool-ng/builds/arm-l
inux-gnueabihf-raspbian-linux/install --with-sysroot=/cbuild/slaves/oort61/crosstool-ng/builds/
arm-linux-gnueabihf-raspbian-linux/install/arm-linux-gnueabihf/libc --enable-languages=c,c++,fo
rtran --disable-multilib --with-arch=armv6 --with-tune=arm1176jz-s --with-fpu=vfp --with-float=
hard --with-pkgversion='crosstool-NG linaro-1.13.1+bzr2458 - Linaro GCC 2012.08' --with-bugurl=
https://bugs.launchpad.net/gcc-linaro --enable-__cxa_atexit --enable-libmudflap --enable-libgom
p --enable-libssp --with-gmp=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-rasp
bian-linux/.build/arm-linux-gnueabihf/build/static --with-mpfr=/cbuild/slaves/oort61/crosstool-
ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-mpc
=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-
gnueabihf/build/static --with-ppl=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf
-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-cloog=/cbuild/slaves/oort61/cros
stool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --wi
th-libelf=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/a
rm-linux-gnueabihf/build/static --with-host-libstdcxx='-L/cbuild/slaves/oort61/crosstool-ng/bui
lds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static/lib -lpwl' --ena
ble-threads=posix --disable-libstdcxx-pch --enable-linker-build-id --enable-plugin --enable-gol
d --with-local-prefix=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-li
nux/install/arm-linux-gnueabihf/libc --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.7.2 20120731 (prerelease) (crosstool-NG linaro-1.13.1+bzr2458 - Linaro GCC 2012.08
)
Aber hey! Ich habe das getan und die Bibliotheken funktionieren immer noch nicht!
Wir sind noch nicht fertig! Bisher haben wir nur die Grundlagen behandelt.
In Ihrem raspberrypi
erstellen Sie einen Ordner mit dem Namen rootfs
.
Jetzt müssen Sie den gesamten /lib
kopieren und /usr
Verzeichnis in diesen neu erstellten Ordner. Normalerweise hole ich das rpi-Image hoch und kopiere es über rsync:
rsync -rl --delete-after --safe-links [email protected]:/{lib,usr} $HOME/raspberrypi/rootfs
wobei 192.168.1.PI
wird durch die IP Ihres Raspberry Pi ersetzt.
Jetzt müssen wir einen cmake
schreiben Konfigurationsdatei. Öffnen Sie ~/home/raspberrypi/pi.cmake
in Ihrem bevorzugten Editor und fügen Sie Folgendes ein:
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)
SET(CMAKE_C_COMPILER $ENV{HOME}/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER $ENV{HOME}/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-g++)
SET(CMAKE_FIND_ROOT_PATH $ENV{HOME}/raspberrypi/rootfs)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
Jetzt sollten Sie in der Lage sein, Ihren cmake
zu kompilieren Programme einfach durch Hinzufügen dieses zusätzlichen Flags:-D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake
.
Verwenden eines Cmake-Hello-World-Beispiels:
git clone https://github.com/jameskbride/cmake-hello-world.git
cd cmake-hello-world
mkdir build
cd build
cmake -D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake ../
make
scp CMakeHelloWorld [email protected]:/home/pi/
ssh [email protected] ./CMakeHelloWorld