Création pour les nouvelles images Raspbian Debian Buster et ARMv6
La réponse de @Stenyg ne fonctionne que pour les anciennes images Raspbian. Le Raspbian récemment publié basé sur Debian Buster nécessite une chaîne d'outils mise à jour :
Dans Debian Buster, le compilateur gcc et la glibc ont été mis à jour vers la version 8.3. La chaîne d'outils en git://github.com/raspberrypi/tools.git
est toujours basé sur l'ancienne version de gcc 6. Cela signifie que l'utilisation de git://github.com/raspberrypi/tools.git
entraînera de nombreuses erreurs de compilation.
Ce tutoriel est basé sur la réponse de @Stenyg. En plus de nombreuses autres solutions sur Internet, ce didacticiel prend également en charge les anciens Rasperry Pi (A, B, B+, Zero ) basé sur le processeur ARMv6.
Configurer la chaîne d'outils
Il n'y a pas de référentiel git officiel contenant une chaîne d'outils mise à jour (voir https://github.com/raspberrypi/tools/issues/102).
J'ai créé un nouveau référentiel github qui inclut la construction et des chaînes d'outils précompilées pour ARMv6 basées sur GCC8 et plus récent :
https://github.com/Pro/raspi-toolchain
Comme mentionné dans le fichier readme du projet, voici les étapes pour obtenir la chaîne d'outils. Vous pouvez également le construire vous-même (voir le README pour plus de détails).
- Téléchargez la chaîne d'outils :
wget https://github.com/Pro/raspi-toolchain/releases/latest/download/raspi-toolchain.tar.gz
- Extractez-le. Remarque :La chaîne d'outils doit être en
/opt/cross-pi-gcc
puisqu'il n'est pas indépendant de l'emplacement.
sudo tar xfz raspi-toolchain.tar.gz --strip-components=1 -C /opt
-
Vous avez terminé! La chaîne d'outils est maintenant en
/opt/cross-pi-gcc
-
Facultatif, ajoutez la chaîne d'outils à votre chemin, en ajoutant :
export PATH=$PATH:/opt/cross-pi-gcc/bin
à la fin du fichier nommé ~/.bashrc
Vous pouvez maintenant soit vous déconnecter et vous reconnecter (c'est-à-dire redémarrer votre session de terminal), soit exécuter . ~/.bashrc
dans votre terminal pour récupérer le PATH
ajout dans votre session de terminal actuelle.
Obtenir les bibliothèques du Raspberry PI
Pour effectuer une compilation croisée pour votre propre Raspberry Pi, qui peut avoir des bibliothèques personnalisées installées, vous devez obtenir ces bibliothèques sur votre hôte.
Créer un dossier $HOME/raspberrypi
.Dans votre raspberrypi
dossier, créez un dossier appelé rootfs
.
Maintenant, vous devez copier l'intégralité du /lib
et /usr
répertoire dans ce dossier nouvellement créé. J'affiche généralement l'image rpi et la copie via rsync :
rsync -vR --progress -rl --delete-after --safe-links [email protected]:/{lib,usr,opt/vc/lib} $HOME/raspberrypi/rootfs
où 192.168.1.PI
est remplacée par l'IP de votre Raspberry Pi.
Utilisez CMake pour compiler votre projet
Pour indiquer à CMake de prendre votre propre chaîne d'outils, vous devez disposer d'un fichier de chaîne d'outils qui initialise les paramètres du compilateur.
Obtenez ce fichier de chaîne d'outils à partir d'ici :https://github.com/Pro/raspi-toolchain/blob/master/Toolchain-rpi.cmake
Vous devriez maintenant pouvoir compiler votre cmake
programmes simplement en ajoutant ce drapeau supplémentaire :-D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake
et en définissant les bonnes variables d'environnement :
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 ..
Un exemple de hello world est montré ici :https://github.com/Pro/raspi-toolchain/blob/master/build_hello_world.sh
Je vais essayer d'écrire ceci comme un tutoriel pour vous afin qu'il devienne facile à suivre.
REMARQUE :ce didacticiel ne fonctionne que pour les anciennes images raspbian. Pour le nouveau Raspbian basé sur Debian Buster, consultez le guide suivant dans ce fil :https://stackoverflow.com/a/58559140/869402
Pré-requis
Avant de commencer, vous devez vous assurer que les éléments suivants sont installés :
apt-get install git rsync cmake libc6-i386 lib32z1 lib32stdc++6
Croisons une compilation !
Commencez par créer un dossier dans votre répertoire personnel appelé raspberrypi
.
Allez dans ce dossier et déroulez le dossier d'outils ENTIER que vous avez mentionné ci-dessus :
git clone git://github.com/raspberrypi/tools.git
Vous vouliez utiliser le suivant des 3, gcc-linaro-arm-linux-gnueabihf-raspbian
, si je n'ai pas mal lu.
Allez dans votre répertoire personnel et ajoutez :
export PATH=$PATH:$HOME/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin
à la fin du fichier nommé ~/.bashrc
Vous pouvez maintenant soit vous déconnecter et vous reconnecter (c'est-à-dire redémarrer votre session de terminal), soit exécuter . ~/.bashrc
dans votre terminal pour récupérer le PATH
ajout dans votre session de terminal actuelle.
Maintenant, vérifiez que vous pouvez accéder au compilateur arm-linux-gnueabihf-gcc -v
. Vous devriez obtenir quelque chose comme ceci :
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
)
Mais bon ! Je l'ai fait et les bibliothèques ne fonctionnent toujours pas !
Nous n'avons pas encore fini ! Jusqu'à présent, nous n'avons fait que les bases.
Dans votre raspberrypi
dossier, créez un dossier appelé rootfs
.
Maintenant, vous devez copier l'intégralité du /lib
et /usr
répertoire dans ce dossier nouvellement créé. J'affiche généralement l'image rpi et la copie via rsync :
rsync -rl --delete-after --safe-links [email protected]:/{lib,usr} $HOME/raspberrypi/rootfs
où 192.168.1.PI
est remplacée par l'IP de votre Raspberry Pi.
Maintenant, nous devons écrire un cmake
fichier de configuration. Ouvrez ~/home/raspberrypi/pi.cmake
dans votre éditeur préféré et insérez ce qui suit :
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)
Vous devriez maintenant pouvoir compiler votre cmake
programmes simplement en ajoutant ce drapeau supplémentaire :-D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake
.
Utilisation d'un exemple cmake hello world :
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