Le compilateur gcc ou g++

 

Anciennement "GNU C Compiler", GCC signifie aujourd'hui "GNU Compiler Collection". Car GCC est devenu un ensemble de compilateurs Libres du projet GNU. Il est capable de compiler du code provenant de différents langages dont C, C++, Objective-C, Java, Ada et Fortran.

Sous Unix, le développement passe souvent par le langage C ou C++. gcc (en minuscule) est donc apparu pour remplacer le compilateur C nommé cc.

 

GCC représente donc le projet GNU Compiler Collection, ou la partie commune aux compilateurs. gcc, le compilateur C/C++ sous Unix.

Par la suite, je parlerai de la partie compilateur C/C++.

 

Compilateur C/C++

Pour compiler un programme C ou C++, vous utiliserez la commande gcc , mais il est possible aussi de le lancer ce compilateur via l'ancienne commande nommée cc (il s'agit simplement d'un lien vers gcc)

gcc [-c|-S|-E] [-std=standard]
[-g] [-pg] [-Olevel]
[-Wwarn...] [-pedantic]
[-Idir...] [-Ldir...]
[-Dmacro[=defn]...] [-Umacro]
[-foption...] [-mmachine-option...]
[-o outfile] infile...

 

Le plus simple pour lancer le compilateur: gcc nom_fichier.c -o nom_fichier_executable

Vous utiliserez gcc pour compiler du code en C

Vous utiliserez g++ ou gcc suivant la configuration de votre système pour compiler du code en C++

Dans ce qui suit, je parle de gcc, mais les paramètres g++ sont identiques à gcc...

 

Les options les plus courantes sont:

-c chemin/nom_fichier Compiler ou assembler les fichiers sources, mais ne pas éditer les liens. La sortie du compilateur est un fichier objet correspondant à chaque fichier source

-o chemin/nom_fichier linker - pour indiquer le nom du fichier en sortie, générer le fichier exécutable

-llibrairie Pour indiquer l'utilisation d'une librairie.

 

Les chemins utilisés pour la recherche des includes ou des librairies:

Par défaut, gcc utilise des chemins pour trouver les librairies et les includes.

Les includes sont recherchés dans les chemins suivant:

/usr/local/include/
/usr/include/

Les librairies sont recherchées dans:

/usr/local/lib/
/usr/lib/

 

Ajouter des chemins de recherche:

Pour ajouter un nouveau chemin au début de la liste des includes ou des librairies, nous pourrons utiliser les options suivantes:

-Ichemin Pour ajouter un nouveau chemin vers des includes.

-Lchemin Pour ajouter un nouveau chemin vers des librairies.

Une autre solution sera aussi de créer des raccourcies dans les répertoires de recherche par défaut.

Annexe

Le nom des fichiers librairies est le suivant:

libXXXXX.a pour une librairie statique (Attention sous AIX, elles peuvent aussi être dynamiques !)

libXXXXX.so pour une librairie dynamique (Attention sur AIX, .a !)

ou XXXXX est le nom de votre librairie.

Le nom de la librairie qui devra être indiquée au compilateur est simplement XXXXX (il ne faut pas indiquer lib et l'extension) après l'option -l

Pour plus d'informations sur les librairies statiques ou dynamiques ou encore pour développer une telle librairie, allez au chapitre Développer une librairie staitique ou dynamique en C/C++.

Exemple d'utilisation

Exemple soit prog1.c prog2.c et prog3.c trois sources utilisant la librairie OpenGL

Vous devez générer les objets de vos trois programmes...

gcc -c prog1.c -o prog1.o

gcc -c prog2.c -o prog2.o

gcc -c prog3.c -o prog3.o

... puis linker la librairie GL

gcc prog1.o prog2.o prog3.o -L/usr/lib -lGL -o monprog (remarque -L n'est pas forcement utile ici, puisque la librairie GL se trouve dans un répertoire standard !)

 

Ou plus rapide: gcc prog1.c prog2.c prog3.c -L/usr/lib -lGL -o monprog

Image non trouvée !Si vous avez à la fois une librairie dynamique et statique, le compilateur utilisera par défaut la dynamique. Vous pouvez forcer l'utilisation de la statique avec l'option -static

 

D'autres compilateurs sur les plate-formes courantes

GNU Linux : Nous venons de le voir : gcc
SUN OS/Solaris : Ce sera gcc ou acc
IBM Aix : Ce sera gcc ou cc ou cc_r

 

Remarque

On notera que gcc non seulement compile, mais permet aussi le linkage (tout comme les autres compilateurs).

Cependant la commande de linkage est traditionnellement ld (toutes plateformes confondues).

 

Pour aller plus loin

Utilisation de la commande make en complément de la commande gcc.

 

Erreurs de compilations

Si lors de la compilation de votre code, vous obtenez le message d'erreur suivant:

gcc: error trying to exec 'cc1plus': execvp: Aucun fichier ou répertoire de ce type

Alors c'est que vous n'avez pas installé le compilateur C++ entièrement (Vous avez peut-être le C (gcc), mais pas le C++ (gcc-c++)).

- Vous pourrez aussi la lister la table de symboles via la fonction nm:
/usr/bin/nm nom_fichier.o

D'autres erreurs possibles:

référence au symbole non défini «_ZTVN10__cxxabiv117__class_type_infoE@@CXXABI_1.3» : Manque lstdc++ lors du linkage (voire sous /usr/lib32 ou 64: ln -s libstdc++.so.6 libstdc++.so)

référence au symbole non défini «expf@@GLIBC_2.2.5» manque -lm

Exemple gcc monfichier.o -lstdc++ -lm

 

Erreur lors du linkage pour du code sous XWindow

référence au symbole non défini «XPending» /lib64/libX11.so.6: error adding symbols: DSO missing from command line Cette fois-ci, il s'agot de la librairie X11 qui est manquante donc ajoutez -lX11 !

idem avec référence au symbole non défini «XOpenDisplay»