Différences entre versions de « C devel cross »

De The Linux Craftsman
Aller à la navigation Aller à la recherche
 
(7 versions intermédiaires par le même utilisateur non affichées)
Ligne 14 : Ligne 14 :
 
== Récupération de la chaîne de compilation ==
 
== Récupération de la chaîne de compilation ==
 
Tout d'abord il faut cerner l'architecture cible ! Dans cet exemple, nous allons utiliser un OrangePi Zéro:
 
Tout d'abord il faut cerner l'architecture cible ! Dans cet exemple, nous allons utiliser un OrangePi Zéro:
[[Fichier:Orange pi zero.jpg|300px|vignette|centré]]
+
[[Fichier:Orange pi zero.jpg|300px|centré]]
  
Cette carte utilise un SoC AllWinner H2+ et d'après la documentation de AllWinner le CPU est un ARM Cortex-A7:
+
Cette carte utilise un SoC AllWinner H2+ et d'après la [http://wiki.friendlyarm.com/wiki/images/0/08/Allwinner_H2%2B_Datasheet_V1.2.pdf documentation] de AllWinner le CPU est un ARM Cortex-A7 (32 bits):
[[Fichier:allwinner h2 documentation.png|600px|vignette|centré]]
+
[[Fichier:allwinner h2 documentation.png|600px|centré]]
 
 
Il faudra donc récupérer la bonne chaîne de compilation pour sur le site [https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain arm.com]:
 
[[Fichier:arm toolchain choice.png|600px|vignette|centré]]
 
  
 
Il faut maintenant déterminer quelle version de la chaîne de compilation récupérer, cela se décide en fonction du système d'exploitation présent sur la machine:
 
Il faut maintenant déterminer quelle version de la chaîne de compilation récupérer, cela se décide en fonction du système d'exploitation présent sur la machine:
Ligne 35 : Ligne 32 :
 
* ''eabi''  → utilise [https://fr.wikipedia.org/wiki/Application_binary_interface l'interface binaire-programme] embarquée (''Embedded ABI'');
 
* ''eabi''  → utilise [https://fr.wikipedia.org/wiki/Application_binary_interface l'interface binaire-programme] embarquée (''Embedded ABI'');
 
* ''hf''  →  utilise une [https://fr.wikipedia.org/wiki/Unit%C3%A9_de_calcul_en_virgule_flottante unité de calcul en virgule flottant] (''hardware FPU'').
 
* ''hf''  →  utilise une [https://fr.wikipedia.org/wiki/Unit%C3%A9_de_calcul_en_virgule_flottante unité de calcul en virgule flottant] (''hardware FPU'').
 +
Il faudra donc récupérer la bonne chaîne de compilation pour sur le site [https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain arm.com]:
 +
[[Fichier:arm toolchain choice.png|600px|centré]]
 
Sur ce système la chaîne de compilation est en version 8.3.0, nous pouvons donc choisir de déplier la section 8.3:
 
Sur ce système la chaîne de compilation est en version 8.3.0, nous pouvons donc choisir de déplier la section 8.3:
[[Fichier:arm toolchain 8.3 choice.png|600px|vignette|centré]]
+
[[Fichier:arm toolchain 8.3 choice.png|600px|centré]]
 
Et télécharger la chaîne de compilation appropriée pour l'architecture de développement (Linux 64bits) et l'architecture cible (''eabihf''):
 
Et télécharger la chaîne de compilation appropriée pour l'architecture de développement (Linux 64bits) et l'architecture cible (''eabihf''):
[[Fichier:arm toolchain linux 64 eabihf choice.png|350px|vignette|centré]]
+
[[Fichier:arm toolchain linux 64 eabihf choice.png|350px|centré]]
  
 
== Installation de la chaîne de compilation ==
 
== Installation de la chaîne de compilation ==
Ligne 45 : Ligne 44 :
 
<pre>
 
<pre>
 
# cd /opt
 
# cd /opt
# tar -xf /CHEMIN_VERS_LA_CHAINE/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz
+
# tar -xf /opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz
 
</pre>
 
</pre>
 
Puis créer un lien symbolique dans le dossier ''/usr/bin'' qui se trouve dans la variable ''PATH'' de l'environnement:
 
Puis créer un lien symbolique dans le dossier ''/usr/bin'' qui se trouve dans la variable ''PATH'' de l'environnement:
 
<pre>
 
<pre>
# chmod +x -R /CHEMIN_VERS_LA_CHAINE/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin
+
# chmod +x -R /opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin
# ln -fs /CHEMIN_VERS_LA_CHAINE/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ /usr/bin/
+
# ln -fs /opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ /usr/bin/
# ln -fs /CHEMIN_VERS_LA_CHAINE/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc /usr/bin/
+
# ln -fs /opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc /usr/bin/
 
</pre>
 
</pre>
 
On peut vérifier la version du compilateur:
 
On peut vérifier la version du compilateur:
Ligne 58 : Ligne 57 :
 
Using built-in specs.
 
Using built-in specs.
 
COLLECT_GCC=arm-linux-gnueabihf-gcc
 
COLLECT_GCC=arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/mnt/c/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/../libexec/gcc/arm-linux-gnueabihf/8.3.0/lto-wrapper
+
COLLECT_LTO_WRAPPER=/opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/../libexec/gcc/arm-linux-gnueabihf/8.3.0/lto-wrapper
 
Target: arm-linux-gnueabihf
 
Target: arm-linux-gnueabihf
 
Configured with: /tmp/dgboter/bbs/rhev-vm8--rhe6x86_64/buildbot/rhe6x86_64--arm-linux-gnueabihf/build/src/gcc/configure --target=arm-linux-gnueabihf --prefix= --with-sysroot=/arm-linux-gnueabihf/libc --with-build-sysroot=/tmp/dgboter/bbs/rhev-vm8--rhe6x86_64/buildbot/rhe6x86_64--arm-linux-gnueabihf/build/build-arm-linux-gnueabihf/install//arm-linux-gnueabihf/libc --with-bugurl=https://bugs.linaro.org/ --enable-gnu-indirect-function --enable-shared --disable-libssp --disable-libmudflap --enable-checking=release --enable-languages=c,c++,fortran --with-gmp=/tmp/dgboter/bbs/rhev-vm8--rhe6x86_64/buildbot/rhe6x86_64--arm-linux-gnueabihf/build/build-arm-linux-gnueabihf/host-tools --with-mpfr=/tmp/dgboter/bbs/rhev-vm8--rhe6x86_64/buildbot/rhe6x86_64--arm-linux-gnueabihf/build/build-arm-linux-gnueabihf/host-tools --with-mpc=/tmp/dgboter/bbs/rhev-vm8--rhe6x86_64/buildbot/rhe6x86_64--arm-linux-gnueabihf/build/build-arm-linux-gnueabihf/host-tools --with-isl=/tmp/dgboter/bbs/rhev-vm8--rhe6x86_64/buildbot/rhe6x86_64--arm-linux-gnueabihf/build/build-arm-linux-gnueabihf/host-tools --with-arch=armv7-a --with-fpu=neon --with-float=hard --with-arch=armv7-a --with-pkgversion='GNU Toolchain for the A-profile Architecture 8.3-2019.03 (arm-rel-8.36)'
 
Configured with: /tmp/dgboter/bbs/rhev-vm8--rhe6x86_64/buildbot/rhe6x86_64--arm-linux-gnueabihf/build/src/gcc/configure --target=arm-linux-gnueabihf --prefix= --with-sysroot=/arm-linux-gnueabihf/libc --with-build-sysroot=/tmp/dgboter/bbs/rhev-vm8--rhe6x86_64/buildbot/rhe6x86_64--arm-linux-gnueabihf/build/build-arm-linux-gnueabihf/install//arm-linux-gnueabihf/libc --with-bugurl=https://bugs.linaro.org/ --enable-gnu-indirect-function --enable-shared --disable-libssp --disable-libmudflap --enable-checking=release --enable-languages=c,c++,fortran --with-gmp=/tmp/dgboter/bbs/rhev-vm8--rhe6x86_64/buildbot/rhe6x86_64--arm-linux-gnueabihf/build/build-arm-linux-gnueabihf/host-tools --with-mpfr=/tmp/dgboter/bbs/rhev-vm8--rhe6x86_64/buildbot/rhe6x86_64--arm-linux-gnueabihf/build/build-arm-linux-gnueabihf/host-tools --with-mpc=/tmp/dgboter/bbs/rhev-vm8--rhe6x86_64/buildbot/rhe6x86_64--arm-linux-gnueabihf/build/build-arm-linux-gnueabihf/host-tools --with-isl=/tmp/dgboter/bbs/rhev-vm8--rhe6x86_64/buildbot/rhe6x86_64--arm-linux-gnueabihf/build/build-arm-linux-gnueabihf/host-tools --with-arch=armv7-a --with-fpu=neon --with-float=hard --with-arch=armv7-a --with-pkgversion='GNU Toolchain for the A-profile Architecture 8.3-2019.03 (arm-rel-8.36)'
Ligne 65 : Ligne 64 :
 
</pre>
 
</pre>
  
= Projet C en compilation croisée sous Eclipse =
+
= Projet C++ en compilation croisée sous Eclipse =
Il suffit de créer un projet ''C/C++'' classique:
+
Il faut démarrer l'assistant de création d'un projet C/C++:
[[Fichier:New c project.png|350px|vignette|centré]]
+
[[Fichier:New c++ project1.png|600px|centré]]
 +
<div align="center">
 +
{|
 +
|-
 +
||
 +
Sélectionner un projet C ou C++ (au choix)
 +
|width="10px"|
 +
||
 +
Choisir le projet Hello Wolrd ''Cross GCC''
 +
|width="10px"|
 +
||
 +
Préciser le préfixe du compilateur croisé (ici ''arm-linux-gnueabihf-'')
 +
|-
 +
||
 +
[[Fichier:New c++ project2.png|500px|centré]]
 +
|width="10px"|
 +
||
 +
[[Fichier:Hello world cross.png|500px|centré]]
 +
|width="10px"|
 +
||
 +
[[Fichier:C++ project cross compile prefix.png|500px|centré]]
 +
|}
 +
</div>
 +
Maintenant que le projet est créé, il faut le compiler grâce au marteau
 +
[[Fichier:C compilation button.png|200px|centré]]
 +
<div align="center">
 +
{|
 +
|-
 +
||
 +
Le résultat de la compilation se trouve dans le répertoire Debug
 +
|width="10px"|
 +
||
 +
Il ne reste plus qu'a transférer le binaire sur l'Orange Pi pour l'exécuter !
 +
|-
 +
||
 +
[[Fichier:debug content compile.png|300px|centré]]
 +
|width="10px"|
 +
||
 +
[[Fichier:execution cross compile.png|600px|centré]]
 +
|}
 +
</div>

Version actuelle datée du 12 mai 2020 à 14:36

Introduction

Lorsque l'on compile un programme en C on passe par tout une chaîne de logiciels que l'on appel la chaîne de compilation (toolchain). Si l'on prend le cas de la chaîne de compilation GNU (GNU toolchain), elle est composée de:

  • binutils : utilitaires permettant la conversion du pseudo-code généré par la compilation en instructions comprises par le processeur cible (assembleur);
  • gcc : les compilateurs C et C++ (gcc et g++);
  • glibc, bibliothèque pour les appels au noyau et le traitement bas-niveau (stdio.h, stdlib.h, pthread.h, etc...);
  • les en-têtes du noyau requis par la bibliothèque glibc (linux-headers dans le cas du noyau Linux) ;
  • gdb, déboguer pour chaîne binaire déjà compilée;

La compilation se fait sur et pour la même architecture que la machine de développement. La compilation croisée permet de modifier l'architecture cible !

On peut alors développer sur une architecture 64 bits Linux (ou Windows) et compiler son programme pour une architecture MIPS, PPC, ARM, AVR, etc...

Pré-requis

Récupération de la chaîne de compilation

Tout d'abord il faut cerner l'architecture cible ! Dans cet exemple, nous allons utiliser un OrangePi Zéro:

Orange pi zero.jpg

Cette carte utilise un SoC AllWinner H2+ et d'après la documentation de AllWinner le CPU est un ARM Cortex-A7 (32 bits):

Allwinner h2 documentation.png

Il faut maintenant déterminer quelle version de la chaîne de compilation récupérer, cela se décide en fonction du système d'exploitation présent sur la machine:

root@orangepizero:~# ll /usr/lib/gcc
total 4
drwxr-xr-x 3 root root 4096 Apr  6  2019 arm-linux-gnueabihf
root@orangepizero:~# ll /usr/lib/gcc/arm-linux-gnueabihf/
total 4
drwxr-xr-x 5 root root 4096 Feb  7 19:38 8

On apprend que la chaîne de compilation:

Il faudra donc récupérer la bonne chaîne de compilation pour sur le site arm.com:

Arm toolchain choice.png

Sur ce système la chaîne de compilation est en version 8.3.0, nous pouvons donc choisir de déplier la section 8.3:

Arm toolchain 8.3 choice.png

Et télécharger la chaîne de compilation appropriée pour l'architecture de développement (Linux 64bits) et l'architecture cible (eabihf):

Arm toolchain linux 64 eabihf choice.png

Installation de la chaîne de compilation

Il faut maintenant installer la chaîne compilation sur le système cible pour pouvoir l'utiliser. Pour ce faire nous allons décompresser l'archive dans un dossier:

# cd /opt
# tar -xf /opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz

Puis créer un lien symbolique dans le dossier /usr/bin qui se trouve dans la variable PATH de l'environnement:

# chmod +x -R /opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin
# ln -fs /opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ /usr/bin/
# ln -fs /opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc /usr/bin/

On peut vérifier la version du compilateur:

[root@DESKTOP-19AIBA2 ~]# arm-linux-gnueabihf-gcc -v
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/../libexec/gcc/arm-linux-gnueabihf/8.3.0/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: /tmp/dgboter/bbs/rhev-vm8--rhe6x86_64/buildbot/rhe6x86_64--arm-linux-gnueabihf/build/src/gcc/configure --target=arm-linux-gnueabihf --prefix= --with-sysroot=/arm-linux-gnueabihf/libc --with-build-sysroot=/tmp/dgboter/bbs/rhev-vm8--rhe6x86_64/buildbot/rhe6x86_64--arm-linux-gnueabihf/build/build-arm-linux-gnueabihf/install//arm-linux-gnueabihf/libc --with-bugurl=https://bugs.linaro.org/ --enable-gnu-indirect-function --enable-shared --disable-libssp --disable-libmudflap --enable-checking=release --enable-languages=c,c++,fortran --with-gmp=/tmp/dgboter/bbs/rhev-vm8--rhe6x86_64/buildbot/rhe6x86_64--arm-linux-gnueabihf/build/build-arm-linux-gnueabihf/host-tools --with-mpfr=/tmp/dgboter/bbs/rhev-vm8--rhe6x86_64/buildbot/rhe6x86_64--arm-linux-gnueabihf/build/build-arm-linux-gnueabihf/host-tools --with-mpc=/tmp/dgboter/bbs/rhev-vm8--rhe6x86_64/buildbot/rhe6x86_64--arm-linux-gnueabihf/build/build-arm-linux-gnueabihf/host-tools --with-isl=/tmp/dgboter/bbs/rhev-vm8--rhe6x86_64/buildbot/rhe6x86_64--arm-linux-gnueabihf/build/build-arm-linux-gnueabihf/host-tools --with-arch=armv7-a --with-fpu=neon --with-float=hard --with-arch=armv7-a --with-pkgversion='GNU Toolchain for the A-profile Architecture 8.3-2019.03 (arm-rel-8.36)'
Thread model: posix
gcc version 8.3.0 (GNU Toolchain for the A-profile Architecture 8.3-2019.03 (arm-rel-8.36))

Projet C++ en compilation croisée sous Eclipse

Il faut démarrer l'assistant de création d'un projet C/C++:

New c++ project1.png

Sélectionner un projet C ou C++ (au choix)

Choisir le projet Hello Wolrd Cross GCC

Préciser le préfixe du compilateur croisé (ici arm-linux-gnueabihf-)

New c++ project2.png
Hello world cross.png
C++ project cross compile prefix.png

Maintenant que le projet est créé, il faut le compiler grâce au marteau

C compilation button.png

Le résultat de la compilation se trouve dans le répertoire Debug

Il ne reste plus qu'a transférer le binaire sur l'Orange Pi pour l'exécuter !

Debug content compile.png
Execution cross compile.png