CS107 Compilation de programmes C avec GCC

Écrit par Chris Gregg, avec des modifications par Nick Troccoli

Cliquez ici pour une vidéo de présentation.

Le compilateur que nous utiliserons pour le CS107 est appelé « GNU Compiler Collection » (gcc). C’est l’un des compilateurs les plus utilisés, et il est à la fois un logiciel libre, et disponible sur de nombreuses plateformes informatiques différentes.

gcc effectue l’étape de compilation pour construire un programme, puis il appelle d’autres programmes pour assembler le programme et pour lier les parties constitutives du programme en un programme exécutable que vous pouvez exécuter. Nous apprendrons un peu plus sur chacune de ces étapes au cours du CS107, mais ce qui est bien, c’est que gcc peut produire l’ensemble du programme exécutable (exécutable) pour vous avec une seule commande.

En CS107, nous utiliserons principalement des Makefiles pour compiler, assembler et lier notre code, mais le Makefile exécute gcc pour faire le travail. This is just a quick overview on how to compile and run your own programs should you decide to do so without a Makefile.

The simplest way to run gcc is to provide gcc a list of .c files:

$ gcc hello.c$

Note that you do not put header files (.h) into the gcc command: it reads in the header files as it compiles, based on the #include statements inside .c files.

If the program compiled without errors or warnings, you don’t get any output from gcc, and you will have a new file in your directory, called a.out. To run this file, you need to tell the shell to run the file in the current directory, by using ./ before the name:

$ ./a.outHello, World!$

Nous ne voulons généralement pas que nos programmes soient nommés a.out, vous pouvez donc donner à gcc une option, -o programName, pour lui indiquer comment nommer le fichier exécutable :

$ gcc hello.c -o hello$ ./helloHello, World!$

Note : faites attention à ne pas entrer accidentellement un nom de fichier exécutable qui est le même que votre fichier d’entrée – quelque chose comme :

$ gcc hello.c -o hello.c

Sur myth, votre profil a été configuré pour attraper l’erreur et ne pas la compiler, laissant votre fichier source intact. Ce n’est pas le cas sur de nombreux autres systèmes Linux, alors faites attention ! Sur d’autres systèmes, GCC écraserait votre fichier source avec le nouvel exécutable.

gcc prend de nombreuses options de ligne de commande (flags) qui modifient son comportement. L’un des drapeaux les plus courants est celui du  » niveau d’optimisation « , -O (majuscule ‘o’). gcc a la capacité d’optimiser votre code pour des situationsvariables.

  1. -O ou -O1 : Optimiser. L’optimisation de la compilation prend un peu plus de temps, et beaucoup plus de mémoire pour une grande fonction. Avec -O, le compilateur essaie de réduire la taille du code et le temps d’exécution, sans effectuer d’optimisations qui prennent beaucoup de temps de compilation.
  2. -O2 : Optimiser encore plus. GCC effectue presque toutes les optimisations prises en charge qui n’impliquent pas un compromis espace-vitesse. Par rapport à -O, cette option augmente à la fois le temps de compilation et les performances du code généré.
  3. -O3 : Optimiser encore plus. -O3 active toutes les optimisations spécifiées par -O2 et active également d’autres optimisations. C’est souvent la meilleure option à utiliser.
  4. -O0 : Réduit le temps de compilation et fait en sorte que le débogage produise les résultats attendus. Il s’agit de l’option par défaut.
  5. -Os : Optimiser pour la taille. -Os active toutes les -O2 optimisations qui n’augmentent généralement pas la taille du code. Il effectue également d’autres optimisations destinées à réduire la taille du code.
  6. – Rapide : Ne pas tenir compte du respect strict des normes. -Ofast active toutes les -O3 optimisations. Il active également les optimisations qui ne sont pas valables pour tous les programmes conformes aux normes.
  7. -Og : Optimiser l’expérience de débogage. -Og permet des optimisations qui n’interfèrent pas avec le débogage. Il devrait être le niveau d’optimisation de choix pour le cycle standard édition-compilation-débogage, offrant un niveau d’optimisation raisonnable tout en maintenant une compilation rapide et une bonne expérience de débogage. Nous utiliserons -Og en CS107 lorsque nous déboguerons.

Voir la page man pour gcc pour plus de détails sur l’optimisation (ou voir ici pour plus d’informations sur les optimisations).

Un autre drapeau commun est l’option -std=gnu99, qui indique à gcc d’utiliser la « version gnu c de la norme c de 1999. » Cette norme fournit une syntaxe telle que la possibilité de définir une variable à l’intérieur d’une déclaration de boucle for (par exemple, for (int i = ...). Nous utiliserons cette norme en CS107.

Nous utiliserons également le drapeau -g, qui nous permet d’utiliser le débogueur, gdb, pour nous donner les numéros de ligne exacts dans notre code lorsque nous l’exécutons.

Exemple:

$ gcc -std=gnu99 -g -Og loop.c -o loop 

Si vous souhaitez obtenir encore plus d’informations sur gcc, consultez la section 1 de ce document Stanford Unix Programming Tools, ainsi que le manuel complet de gcc(GNU).