Premiers pas avec gcc

“Bonjour le monde!” avec des options de ligne de commande communes

Pour les programmes avec un seul fichier source, l’utilisation de gcc est simple.

/* File name is hello_world.c */
#include <stdio.h>

int main(void)
{
    int i;
    printf("Hello world!\n");
}

Pour compiler le fichier hello_world.c depuis la ligne de commande :

gcc hello_world.c

gcc compilera alors le programme et sortira l’exécutable dans le fichier a.out. Si vous souhaitez nommer l’exécutable, utilisez l’option -o.

gcc hello_world.c -o hello_world

L’exécutable sera alors nommé hello_world au lieu de a.out. Par défaut, il n’y a pas beaucoup d’avertissements émis par gcc. gcc a de nombreuses options d’avertissement et c’est une bonne idée de consulter la documentation de gcc pour savoir ce qui est disponible. L’utilisation de ‘-Wall’ est un bon point de départ et couvre de nombreux problèmes courants.

gcc -Wall hello_world.c -o hello_world

Production:

hello_world.c: In function ‘main’:
hello_world.c:6:9: warning: unused variable ‘i’ [-Wunused-variable]
     int i;
         ^

Ici, nous voyons que nous recevons maintenant un avertissement indiquant que la variable ‘i’ a été déclarée mais pas utilisée du tout dans la fonction.

Si vous envisagez d’utiliser un débogueur pour tester votre programme, vous devrez indiquer à gcc d’inclure les informations de débogage. Utilisez l’option ‘-g’ pour la prise en charge du débogage.

gcc -Wall -g hello_world.c -o hello_world

hello_world dispose désormais d’informations de débogage prises en charge par GDB. Si vous utilisez un débogueur différent, vous devrez peut-être utiliser différentes options de débogage pour que la sortie soit formatée correctement. Consultez la documentation officielle de gcc pour plus d’options de débogage.

Par défaut, gcc compile le code afin qu’il soit facile à déboguer. gcc peut optimiser la sortie afin que l’exécutable final produise le même résultat mais ait des performances plus rapides et peut aboutir à un exécutable de plus petite taille. L’option ‘-O’ permet l’optimisation. Il existe plusieurs qualificatifs reconnus à ajouter après le O pour spécifier le niveau d’optimisation. Chaque niveau d’optimisation ajoute ou supprime une liste d’options de ligne de commande. ‘-O2’, ‘-Os’, ‘-O0’ et ‘-Og’ sont les niveaux d’optimisation les plus courants.

gcc -Wall -O2 hello_world.c -o hello_world

‘-O2’ est le niveau d’optimisation le plus courant pour le code prêt pour la production. Il offre un excellent équilibre entre l’augmentation des performances et la taille finale de l’exécutable.

gcc -Wall -Os hello_world.c -o hello_world

‘-Os’ est similaire à ‘-O2’, sauf que certaines optimisations qui peuvent augmenter la vitesse d’exécution en augmentant la taille de l’exécutable sont désactivées. Si la taille finale de l’exécutable est importante pour vous, essayez ‘-Os’ et voyez s’il y a une différence de taille notable dans l’exécutable final.

gcc -Wall -g -Og hello_world.c -o -hello_world

Notez que dans les exemples ci-dessus avec ‘-Os’ et ‘-O2’, l’option ‘-g’ a été supprimée. En effet, lorsque vous commencez à dire au compilateur d’optimiser le code, certaines lignes de code peuvent essentiellement ne plus exister dans l’exécutable final, ce qui rend le débogage difficile. Cependant, il existe également des cas où certaines erreurs ne se produisent que lorsque les optimisations sont activées. Si vous souhaitez déboguer votre application et que le compilateur optimise le code, essayez l’option ‘-Og’. Cela indique à gcc d’effectuer toutes les optimisations qui ne devraient pas entraver l’expérience de débogage.

gcc -Wall -g -O0 hello_world.c -o hello_world

‘-O0’ effectue encore moins d’optimisations que ‘-Og’. C’est le niveau d’optimisation que gcc utilise par défaut. Utilisez cette option si vous voulez vous assurer que les optimisations sont désactivées.

Déterminer la version de gcc

Lorsque vous vous référez à la documentation de gcc, vous devez savoir quelle version de gcc vous utilisez. Le projet GCC a un manuel pour chaque version de gcc qui inclut les fonctionnalités qui sont implémentées dans cette version. Utilisez l’option ‘-v’ pour déterminer la version de gcc que vous utilisez.

gcc -v

Exemple de sortie :

Using built-in specs.
COLLECT_GCC=/usr/bin/gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/5.3.1/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,objc,obj-c++,fortran,ada,go,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --disable-libgcj --with-default-libstdcxx-abi=gcc4-compatible --with-isl --enable-libmpx --enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 5.3.1 20160406 (Red Hat 5.3.1-6) (GCC)

Dans cet exemple, nous voyons que nous exécutons gcc version 5.3.1. Vous sauriez alors vous référer au manuel de GCC 5.3. Il est également utile d’inclure votre version de gcc lorsque vous posez des questions au cas où vous auriez un problème spécifique à la version.