J'essaie d'obtenir une compilation croisée pour Raspberry Pi fonctionnant sur ma machine Ubuntu.
Au cours de mes premières tentatives, j'utilisais le compilateur arm-linux-gnueabi, disponible dans le repo Ubuntu. J'ai fait fonctionner ça. J'ai pu créer toutes mes dépendances et utiliser le compilateur croisé dans mon projet cmake.
Cependant, je pense que je devrais utiliser la version hf, alors je suis passé à arm-linux-gnueabihf. Ensuite, j'ai réalisé que cela ne fonctionnait pas avec Raspberry Pi puisqu'il s'agit d'armv6.
Après quelques recherches sur Google, j'ai ensuite trouvé la chaîne d'outils prédéfinie de GitHub .
J'ai téléchargé la chaîne d'outils, mais je ne comprends pas vraiment comment «l'installer». J'ai extrait les fichiers dans mon répertoire personnel. La structure du répertoire ressemble à ceci:
/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)
Si je change de répertoire dans le dossier bin INNER, je peux compiler un programme de test à partir du terminal sans aucun problème.
~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/
arm-linux-gnueabihf/bin$ g++ test.cpp -o test
J'ai ensuite essayé de compiler un programme de test dans le dossier bin OUTER, qui contient les versions préfixées des outils.
~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin$
arm-linux-gnueabihf-g++ test.cpp -o test
Cependant, lorsque j'essaie d'utiliser le compilateur maintenant (depuis l'extérieur du répertoire bin interne), il est impossible de trouver la bibliothèque partagée libstdc ++ fournie avec la chaîne d'outils:
arm-linux-gnueabihf-gcc: error while loading shared libraries:
libstdc++.so.6: cannot open shared object file: No such file or directory.
De plus, je souhaite pouvoir utiliser le compilateur sans avoir à naviguer vers le répertoire bin. J'ai donc essayé d'ajouter le répertoire bin OUTER (puisque je veux les versions préfixées) et les deux répertoires lib à mon PATH:
export PATH=$PATH:~/tools/.../bin
export PATH=$PATH:~/tools/.../lib
export PATH=$PATH:~/tools/.../.../lib
Cependant, cela entraîne la même erreur. Comment dois-je «installer» la chaîne d'outils afin de pouvoir utiliser la chaîne d'outils de partout, comme je peux le faire lorsque j'utilise les compilateurs croisés du repo Ubuntu?
Réponses:
Je vais essayer d'écrire ceci comme un tutoriel pour que cela devienne facile à suivre.
REMARQUE: ce tutoriel ne fonctionne que pour les anciennes images raspbian. Pour le plus récent 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:
Croisons-nous compilons une tarte!
Commencez par créer un dossier dans votre répertoire personnel appelé
raspberrypi
.Accédez à ce dossier et déroulez le dossier d'outils ENTIER que vous avez mentionné ci-dessus:
Vous vouliez utiliser les 3 suivants
gcc-linaro-arm-linux-gnueabihf-raspbian
, si je n'ai pas mal lu.Allez dans votre répertoire personnel et ajoutez:
à la fin du fichier nommé
~/.bashrc
Vous pouvez maintenant vous déconnecter et vous reconnecter (c'est-à-dire redémarrer votre session de terminal), ou exécuter
. ~/.bashrc
dans votre terminal pour récupérer l'PATH
ajout dans votre session de terminal en cours.Maintenant, vérifiez que vous pouvez accéder au compilateur
arm-linux-gnueabihf-gcc -v
. Vous devriez obtenir quelque chose comme ceci:Mais salut! J'ai fait ça 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
.Vous devez maintenant copier l'intégralité du répertoire
/lib
et/usr
dans ce dossier nouvellement créé. J'apporte généralement l'image rpi et la copie via rsync:où
192.168.1.PI
est remplacé 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:Maintenant , vous devriez être en mesure de compiler vos
cmake
programmes en ajoutant simplement ce drapeau supplémentaire:-D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake
.En utilisant un exemple de cmake hello world :
la source
ia32-libs
package n'est pas disponible sur Ubuntu 13.10. J'ai utilisé à lalibc6-i386 lib32z1 lib32stdc++6
place.Construction 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 de
git://github.com/raspberrypi/tools.git
est toujours basée sur l'ancienne version de gcc 6. Cela signifie que l'utilisationgit://github.com/raspberrypi/tools.git
entraînera de nombreuses erreurs de compilation.Ce tutoriel est basé sur la réponse @Stenyg. En plus de nombreuses autres solutions sur Internet, ce tutoriel prend également en charge les anciens Rasperry Pi (A, B, B +, Zero ) basés sur le processeur ARMv6. Voir aussi: GCC 8 Cross Compiler génère un exécutable ARMv7 au lieu d'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 les 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 Lisez-moi 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).
/opt/cross-pi-gcc
car elle n'est pas indépendante de l'emplacement.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:
à la fin du fichier nommé
~/.bashrc
Vous pouvez maintenant vous déconnecter et vous reconnecter (c'est-à-dire redémarrer votre session de terminal), ou exécuter
. ~/.bashrc
dans votre terminal pour récupérer l'PATH
ajout dans votre session de terminal en cours.Récupérez 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éez un dossier
$HOME/raspberrypi
. Dans votreraspberrypi
dossier, créez un dossier appelérootfs
.Vous devez maintenant copier l'intégralité du répertoire
/lib
et/usr
dans ce dossier nouvellement créé. J'apporte généralement l'image rpi et la copie via rsync:où
192.168.1.PI
est remplacé par l'IP de votre Raspberry Pi.Utilisez CMake pour compiler votre projet
Pour dire à 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 vos
cmake
programmes simplement en ajoutant cet indicateur supplémentaire:-D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake
et en définissant les bonnes variables d'environnement:Un exemple de bonjour le monde est montré ici: https://github.com/Pro/raspi-toolchain/blob/master/build_hello_world.sh
la source
--safe-links
argument/opt/cross-pi-gcc
?Je n'ai pas pu obtenir le compilateur (
x64
version) pour utiliser lesysroot
jusqu'à ce que j'aie ajoutéSET(CMAKE_SYSROOT $ENV{HOME}/raspberrypi/rootfs)
àpi.cmake
.la source
Pour l'hôte Windows, je recommande vivement ce tutoriel :
Ni plus ni moins!
Chaînes d'outils GNU prédéfinies disponibles pour Raspberry, Beaglebone, Cubieboard, AVR (Atmel) et plus
la source
Vous pouvez également utiliser clang . Il était plus rapide que GCC, et maintenant c'est une chose assez stable. Il est beaucoup plus facile de créer un bruit à partir de sources ( vous pouvez vraiment boire une tasse de café pendant le processus de construction ).
En bref:
Compilez votre code:
Vous pouvez éventuellement utiliser les anciens binutils arm-linux-gnueabihf. Ensuite, vous pouvez supprimer l'indicateur "-fuse-ld = lld" à la fin.
Voici mon fichier de chaîne d'outils cmake.
toolchain.cmake
la source
Je n'ai pas pu compiler QT5 avec l'une des chaînes d'outils (assez obsolètes) de git: //github.com/raspberrypi/tools.git. Le script configure a continué à échouer avec une erreur "impossible de déterminer l'architecture" et avec des problèmes de chemin massifs pour les répertoires d'inclusion. Ce qui a fonctionné pour moi, c'est d'utiliser la chaîne d'outils Linaro
en combinaison avec
Ne pas corriger les liens symboliques de la racine système conduit à des erreurs de symboles non définies comme décrit ici: Une erreur de construction de bibliothèques Qt pour le raspberry pi Cela m'est arrivé lorsque j'ai essayé le script fixQualifiedLibraryPaths de tools.git. Tout le reste est décrit en détail dans http://wiki.qt.io/RaspberryPi2EGLFS . Mes paramètres de configuration étaient:
avec / usr / local / rasp / sysroot étant le chemin de ma copie système Raspberry Pi 3 Raspbian (Jessie) locale et / usr / local / qt5pi étant le chemin du QT compilé croisé qui doit également être copié sur le périphérique. Sachez que Jessie est livré avec GCC 4.9.2 lorsque vous choisissez votre chaîne d'outils.
la source
La question initiale a été postée il y a un certain temps et entre-temps Debian a fait d'énormes progrès dans le domaine du support multiarch.
Multiarch est une grande réussite pour la compilation croisée!
En un mot, les étapes suivantes sont nécessaires pour tirer parti de multiarch pour la compilation croisée Raspbian Jessie:
Comme c'est beaucoup de travail, j'ai automatisé la configuration ci-dessus. Vous pouvez lire à ce sujet ici:
Compilation croisée pour Raspbian
la source
il existe un IDE CDP Studio disponible qui rend la compilation croisée et le déploiement assez simples à la fois à partir de Windows et de Linux et vous pouvez simplement cocher la case à cocher de la chaîne d'outils Raspberry pendant l'installation. (PS. Il prend en charge GPIO et I2C donc aucun code n'est nécessaire pour y accéder)
La démo IDE de l'utilisation de la framboise est ici: https://youtu.be/4SVZ68sQz5U
et vous pouvez télécharger l'IDE ici: https://cdpstudio.com/home-edition
la source