Académique Documents
Professionnel Documents
Culture Documents
Je vais traiter ici à la fois de la compilation native avec GCC sous GNU/Linux et
sous Windows, ainsi que comment faire de la compilation croisée avec MinGW pour
Windows sur des systèmes autres que Windows.
Introduction to GCC
GCC signifie « GNU Compiler Collection ». C'est une suite de compilateurs
distribuée par le projet GNU. GCC a été créé par Richard Stallman en 1987 dans le
but de fournir un compilateur C libre pour le développement du système
d'exploitation GNU. À l'origine, GCC signifiait « GNU C Compiler » (il n'y avait que le
compilateur C). GCC est distribué sous les termes de la licenceGNU Public
Licence (GPL).
Utilisation de GCC
GCC est un compilateur en ligne de commande. Il ne fait que ce pour quoi il a été
conçu : compiler. Vous pouvez écrire votre code avec n'importe quel éditeur de texte,
comme vim, emacs (meilleur), kwrite, ou même avec les bloatwares que sont
les IDEtels Kdevelop, Eclipse (ouch!) ou Code::blocks.
Afin d'illustrer les commandes de cet article, je vais utiliser le bien connu
programme « hello world », dont voici le code en C :
#include <stdio.h>
int main ()
{
printf ("Hello world!\n");
return 0;
}
$ gcc hello.c
$ ./a.out
$ gcc -c hello.c
$ gcc -c foo.c
$ gcc -c bar.c
$ gcc -o hello hello.o foo.o bar.o
Par défaut, GCC recherche les fichiers d'en-tête (vous savez, ceux que incluez
avec la directive #include) dans les dossiers /usr/local/include et /usr/include.
Pour lier votre exécutable avec une bibliothèque, utilisez l'option -l suivie du nom
de la bibliothèque sans le préfixe « lib » ni son extension. Par exemple, imaginons
que vous vouliez lier votre programme hello avec la bibliothèque libpng (parce que
votre programme peut sortir un super smiley dans un fichier PNG). Vous devez avoir
le fichier libpng.a (la bibliothèque statique nécessaire pour la compilation) installé
dans le dossier /usr/lib (le dossier standard des bibliothèques) :
Comme pour les fichiers d'en-tête, GCC recherche les bibliothèques par défaut
dans les dossiers /usr/local/lib et /usr/lib. Vous pouvez spécifier des répertoires
additionnels avec l'option -L, comme pour les includes :
Vous pouvez définir des macros avec l'option -D, suivie du nom de la macro et
éventuellement sa valeur (séparés par un signe égal). La commande suivante va
compiler notre fichier source et définir la macro VALUE avec une valeur de 10 :
$ gcc -o hello hello.c -DVALUE=10
GCC possède des options pour optimiser la compilation. Vous pouvez contrôler
l'optimisation avec cinq options : -O (ou -O1), -O2, -O3, -Os et -O0 (ne pas
optimiser). Chacune d'entre elle active en réalité un groupe d'optimisations
individuelles. Les options pour les optimisations individuelles commencent par la
lettre « f » dans leur nom (voir le manuel pour plus d'infos à leur sujet).
Par défaut, les exécutables produits par GCC gardent leur table de symboles et les
informations de relocation. Ceci a pour conséquence d'alourdir le fichier exécutable.
Vous pouvez retirer ces données en passant l'option -s (pour « strip ») à l'éditeur de
liens :
La table de symboles est utile lors du déboguage, donc n'utilisez pas cette option
si vous comptez ensuite utiliser un débogueur avec votre programme !
Vous pouvez spécifier à GCC quelle norme (standard ?) vous voulez utiliser avec
l'option -std, suivie du symbol égal et du nom de la norme. Voir le manuel pour la
liste des normes supportées pour chaque langage. Pour le langage C, vous pouvez
utiliser par exemple c89 pour du C Ansi ou c99 pour du C99. Pour le C Ansi, vous
pouvez également utiliser l'option -ansi à la place de -std :
#include <iostream>
int main ()
{
std::cout << "Hello world!" << std::endl;
return 0;
}
Pour finir, je vais vous présenter l'ultime option d'avertissement de g++, teh -
Weffc++ option ! Si vous arrivez à compiler tout un projet avec cette option activée,
combinée avec l'option -Werror, alors vous êtes un Jedi :p
(astuce : c'est actuellement impossible avec la bibliothèque standard)
C'est tout pour GCC. Je pense avoir fait le tour des options les plus usuelles. Si
vous en voulez plus, je vous recommande de jeter un œil au manuel de GCC.
L'installation de MinGW est très simple. Vous pouvez l'obtenir sur la page de
télécchagrement de MinGW. Téléchargez la dernière version de l'installeur mingw et
lancez-le. Par défaut, MinGW sera installé dans C:\MinGW.
Je vous recommande également de télécharger et installer MSYS, un package qui
apporte quelques outils très utiles lorsqu'on travaille avec GCC, comme un shell
(bash) ou l'outil make.
À noter que les programmes C++ seront bien plus gros en taille que ceux produits
pour Linux ou par Microsoft Visual Studio. Ceci est dû au fait que la bibliothèque
standard doit être liée statiquement avec l'exécutable.
make est l'outil à connaître lorsqu'on veut développer avec GCC ! Il est utilisé afin
d'automatiser les compilations. Vous placez vos instructions de compilation dans un
fichier Makefile puis invoquez make dans votre shell pour lancer la compilation.
make peut également déterminer les portions de votre programme qui doivent être
recompilées, évitant ainsi une recompilation complète à chaque fois que vous
apportez une modification.
gdb est le débogueur GNU. Pour activer le déboguage vous vous devez compiler
avec l'option -g et désactiver toutes les optimisations. valgrind est un autre outil
excellent pour déboguer les fuites de mémoire.