web-dev-qa-db-fra.com

Compilation croisée pour Raspberry Pi dans GCC. Où commencer?

TL/DR : Où puis-je trouver plus d'informations sur la création d'une chaîne d'outils de compilation croisée GCC 4.7.0 pour ARM (gnueabi) (destinée à fonctionner sur un appareil Raspberry Pi)?

Je viens de recevoir un tout nouveau Raspberry Pi et je suis très impatient de commencer à le programmer. J'ai réussi à installer la chaîne d'outils GCC (j'utilise l'image du système Arch Linux) et j'ai compilé quelques programmes de base, tous fonctionnant bien.

J'ai également essayé de compiler les bibliothèques Boost car je les utilise souvent dans mes projets et tout semblait bien fonctionner en suivant les instructions (./bootstrap.sh + ./b2) à l'exception du fait que la compilation a été douloureusement lente. Je l'ai laissé pendant quelques heures mais il a à peine dépassé les premiers fichiers source. Après l'avoir laissé fonctionner pendant la nuit, j'ai découvert que le processus de construction avait été interrompu en raison de la pénurie de RAM.

Donc, je suppose que Rasp Pi est simplement sous-alimenté pour compiler quelque chose d'une telle taille que Boost. Donc, la compilation croisée me vient à l'esprit. Cependant, même s'il existe de nombreuses informations sur la compilation croisée ARM disponible en ligne, je trouve cela déroutant. Par où commencer?

J'ai une version récente de GCC (4.7.0) disponible sur mon Raspberry Pi, donc j'aimerais idéalement effectuer une compilation croisée avec la même version. Où puis-je obtenir la chaîne d'outils GCC 4.7.0 pour ARM? (Je vais compiler sur x86 CentOS 6.2)

Modifier:

J'ai désalloué la mémoire GPU inutile et mis en place une partition de swap de 4 Go sur un lecteur USB, tandis que les fichiers de construction sont sur un partage NFS. Boost se compile désormais beaucoup plus rapidement, il est donc gérable. Je voudrais toujours savoir comment puis-je configurer une chaîne d'outils GCC 4.7 pour la compilation croisée sur mon PC x86, car j'ai l'intention de faire beaucoup de compilation et je voudrais que ce soit aussi rapide que possible.

Édition 2:

Puisque GCC 4.7.0 est relativement nouveau, il ne semble pas y avoir de compilateur croisé pré-construit (i386-> ARM). Je vais probablement devoir en construire un moi-même, ce qui semble une tâche non triviale (j'ai essayé et échoué). Quelqu'un connaît-il un didacticiel à suivre pour la construction d'un compilateur croisé GCC, espérons-le pour l'une des versions récentes?

J'ai essayé avec ce grand script Shell (qui fonctionnait très bien pour construire un compilateur à même architecture) et j'ai réussi à construire binutils et les prérequis de GCC, mais la construction de GCC a continué à échouer avec de nombreuses erreurs cryptiques. Je suis vraiment perdu ici, donc j'apprécierais grandement votre aide.

GCC sur Raspberry Pi a été configuré avec

--prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib 
--mandir=/usr/share/man --infodir=/usr/share/info 
--with-bugurl=https://bugs.archlinux.org/ 
--enable-languages=c,c++,fortran,lto,objc,obj-c++ --enable-shared 
--enable-threads=posix --with-system-zlib --enable-__cxa_atexit 
--disable-libunwind-exceptions --enable-clocale=gnu 
--disable-libstdcxx-pch --enable-libstdcxx-time 
--enable-gnu-unique-object --enable-linker-build-id --with-ppl 
--enable-cloog-backend=isl --enable-lto --enable-gold 
--enable-ld=default --enable-plugin --with-plugin-ld=ld.gold 
--with-linker-hash-style=gnu --disable-multilib --disable-libssp 
--disable-build-with-cxx --disable-build-poststage1-with-cxx 
--enable-checking=release --Host=arm-unknown-linux-gnueabi 
--build=arm-unknown-linux-gnueabi 

Édition 3:

J'ai réussi à construire une chaîne d'outils 4.7 GCC pour ARM (yay!) En utilisant ce script Shell comme suggéré par l'utilisateur dwelch dans les commentaires. J'ai aussi construit newlib et libstdc++ en utilisant cet article comme guide. La chaîne d'outils fonctionne correctement, mais lorsque j'exécute l'exécutable sur mon Raspberry Pi, il échoue avec Illegal instruction. Quelle pourrait en être la cause?

52
Tibor

J'ai trouvé ces instructions Comment construire un compilateur croisé pour votre Raspberry Pi . C'est une excellente marche à travers l'utilisation d'un crosstool-ng outil qui simplifie la configuration d'un compilateur croisé construire BEAUCOUP (il a une interface basée sur Nice curses) et il prend en charge GCC 4.7.

Semble fonctionner très bien!

24
Tibor

http://github.com/dwelch67/raspberrypirépertoire buildgcc il existe un script pour 4.7 gcc/gnu et 3.0 clang/llvm. gnu celui dérivé du script du projet mpx à opencores, j'ai coupé gdb et libgcc, glibc, etc., je l'ai pris dans un compilateur. si vous voulez que d'autres trucs coupent et collent le bras pour les mips.

4
old_timer

Voici un guide étape par étape Comment construire un compilateur croisé Raspberry Pi sous Windows . La raison pour laquelle vous obtenez Illegal Instruction L'erreur est la plus récente Raspbian est compatible hardfp et nécessite des correctifs appropriés pour gcc et eglibc pour supporter hardfp. Sinon, le code généré utilisera un ABI différent, c'est-à-dire qu'il passera des arguments de fonction dans différents registres, donc planter au moment de l'exécution.

Une mauvaise configuration de GCC pour ARMv7 (Raspebby Pi est ARMv6) peut également conduire à Illegal Instruction Erreur. Assurez-vous de spécifier --with-Arch=armv6 option lors de la configuration de GCC.

Le guide lié ci-dessus est basé sur GCC 4.6.3 cependant. Mais je suppose que cela devrait aussi fonctionner avec GCC 4.7.

4
Mikhail Kupchik

Je n'ai pas pu trouver un 4.7 gcc, seulement un 4.6. Pour information, j'ai compilé le noyau du Pi sur une machine Ubuntu assez ancienne (1 GHz, 768 Mo de RAM) en suivant les instructions de cette page: compilation du noya

La construction a pris environ 90 minutes, par rapport aux 6 heures, il est suggéré que cela prendrait le Pi. Le noyau fonctionne bien sur le Pi. Vous pouvez peut-être adapter ces directives pour la compilation croisée d'autres projets sur votre machine Linux x86.

2
NickT

Le projet dockcross est un excellent point de départ pour une chaîne d'outils complètement désodorisée, vous pouvez construire non seulement pour Pi mais pour autre chose. Voici les commandes:

docker run --rm dockcross/linux-armv7 > ./dockcross-linux-armv7
chmod +x ./dockcross-linux-armv7
./dockcross-linux-armv7 bash -c '$CC test/C/hello.c -o hello_arm'

Il a également cmake intégré.

1
Zeev Glozman

Vous pouvez essayer la chaîne d'outils Raspberry-GCC-4.7. .

C'est une chaîne d'outils gcc-4.7.3 pré-construite pour armv6 avec hardfp utilisant gnueabi. Je l'utilise pour recompiler c ++ 11 pour une cible raspberrienne.

Veuillez noter que cela ne fonctionne que sur les hôtes Linux x86_64.

1
kallaballa

Vous pouvez essayer mes binaires de compilation et de compilation natifs open source/précompilés GCC pour Raspberry Pi à partir de cette mise à jour référentiel GitHub :

Ce projet contient l'ensemble UpToDate de binaires de compilateurs croisés et natifs précompilés/précompilés Raspberry Pi GCC, ce qui vous fait gagner beaucoup de temps (aucune compilation ou gestion des erreurs n'est nécessaire). Il suffit d'extraire, de lier et de profiter de la fonctionnalité GCC (Raspberry Pi) complète sur votre machine. Vous pouvez utiliser ses compilateurs natifs pour Raspberry Pi (peut être utilisé avec les anciens et lents 6.3.0 GCC), ou utiliser le compilateur croisé dans n'importe quelle machine Linux (testé sur la dernière Ubuntu/bionic x64) pour compiler des programmes pour votre Raspberry Pi . Tous ces binaires du compilateur sont du matériel Raspberry Pi optimisé pour des performances globales améliorées.

Versions GCC prises en charge:

  • GCC 6.3.0
  • GCC 7.4.0
  • GCC 8.2.0
  • GCC 8.3.0

Raspberry Pis pris en charge:

  • Toutes les versions/modèles Raspberry Pi sont actuellement pris en charge.
  • Tout autre ARM périphériques avec des configurations matérielles similaires peut également fonctionner.

Environnements pris en charge:

  • Cross-Compiler: Tous les Distros Linux (x32/x64) sont actuellement pris en charge.
  • Native-Compiler: Toutes les versions/modèles Raspberry Pi avec Raspbian OS sont pris en charge. D'autres OS peuvent/peuvent ne pas fonctionner.

Langues prises en charge:

  • C++
  • C
  • Fortran
0
abhiTronix

Comme vous l'avez noté, s'appuyer sur le Raspberry Pi lui-même est lent, mais fiable (car il ne s'agit pas d'une compilation croisée), à ​​condition de ne pas manquer de mémoire. Il est peut-être possible de modifier la mémoire et d'échanger les paramètres pour rendre les versions plus grandes possibles (si ce n'est rapide). Je sais que sur les forums, les gens parlent de mettre des partitions root sur SD, des partitions utilisateur sur des clés USB, et bien sûr, cela fera probablement une différence pour obtenir une carte SD rapide (classe 6 ou meilleure). Il est possible, au fil du temps, que les performances de compilation s'améliorent à mesure que le logiciel s'améliore. Ou, peut-être que Raspberry Pi 2 aura un chipset amélioré et plus de RAM. :-)

0
mlepage