3 janv. 2014

Les grandes étapes pour écrire un programme en C ou en C++

Écrire le code source:
Un simple bloc note peut suffire, par exemple on peut écrire dans le fichier plop.c :

#include <stdio.h>
int main(){
printf("plop !\n");
return 0;
}

Compiler:
Ici je suis sous linux donc j'appelle directement gcc (-W et -Wall permettent d'afficher plus de messages
pour vérifier si le code est propre, le -o plop.exe permet de dire que l'exécutable à créer doit s'appeler
plop.exe) :

gcc -W -Wall -o plop.exe plop.c

Implicitement le compilateur fait les trois étapes que j'ai décrites juste avant.
1) Précompilation

/* Tout ce qui est défini par <stdio.h>, y compris printf() */
int main(){
printf("plop !\n");
return 0;
}

2) Compilation (il trouve bien le printf car celui-ci est déclaré dans <stdio.h>)
3) Édition de lien (il trouve bien le printf dans le binaire de la lib c). On peut d'ailleurs le vérifier sous linux
avec ldd :

ldd plop.exe

.. qui donne :

linux-gate.so.1 => (0xb7f2b000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7dbb000)
/lib/ld-linux.so.2 (0xb7f2c000)

Sur la deuxième ligne on voit bien qu'il utilise la lib c. Puis il crée plop.exe. On vérifie en outre qu'il n'y a ni
erreur, ni warning.

Exécution:
Il ne reste plus qu'à le lancer :

./plop.exe

... ce qui donne comme espéré :

plop !

Si une erreur se produit à ce moment là (erreur de segmentation, pas assez de mémoire etc...) il faut
souvent recourir à un debuggeur (par exemple gdb ou ddd), revoir le code source etc... Dans tous les cas,
ce n'est pas un problème de compilation.

Attention, gros piège sous windows
Pour exécuter un programme sous windows, deux méthodes sont possibles.
Méthode 1 : On peut lancer un programme via les commandes ms-dos (en cliquant sur démarrer exécuter
et en tapant "cmd"). On se place ensuite dans le bon répertoire avec la commande cd et on lance le
programme. Dans ce cas tout se passera bien.

Méthode 2 : Si on lance le programme depuis l'explorateur, windows lance les commandes ms-dos, qui
lance le programme, celui-ci se termine, rend la main aux commandes ms-dos, et windows ferme les
commandes ms-dos. Concrètement on n'a alors rien le temps de voir. Il faut donc mettre une "pause"
juste avant la fin du programme si on veut lancer ton exécutable de cette manière :
#include <stdio.h>
int main(){
printf("plop !\n");
getchar(); /*
touche */
return 0;
}
Écrire le code source: Un simple bloc note peut suffire, par exemple on peut écrire dans le fichier plop.c : #include <stdio.h> int ...

Warnings et erreurs à éviter en language C et en language C++

notetotake

Évidemment, dans un environnement de développement, il suffit de cliquer sur "build" et ces trois phases
se déroulent de manière transparente. Toutefois, il est important de les avoir en tête pour interpréter
correctement les messages d'erreur ou de warning d'un compilateur lorsqu'il y en a.
Je rappelle qu'un warning signifie que le code est ambigu et que le code peut être interprété différemment
d'un compilateur à l'autre, mais l'exécutable peut être créé.
A contrario, une erreur signifie que le code n'a pas pu être compilé complètement et que l'exécutable n'a
pas pu être (re)créé. Si un code peut compiler avec des warnings et doit compiler sans erreurs, il vaut
mieux essayer de coder de sorte à n'avoir ni erreur, ni warning.
Évidemment, dans un environnement de développement, il suffit de cliquer sur "build" et ces trois phases se déroulent de manière t...

Les phases de compilation en C et en C++

La première étape consiste à écrire le code source en langage C ou C++ (fichiers .c et .h en C et .cpp et
.hpp en C++). Ensuite on lance une compilation, par exemple avec gcc (en C) ou g++ (en C++). La
compilation (au sens vague du terme) se déroule en trois grandes phases.
1) La précompilation (préprocesseur)
Le compilateur commence par appliquer chaque instruction passée au préprocesseur (toutes les lignes
qui commencent par un #, dont les #define). Ces instructions sont en fait très simples car elles ne
consistent en gros qu'à recopier ou supprimer des sections de codes sans chercher à les compiler. C'est
de la substitution de texte, ni plus ni moins.
C'est notamment à ce moment là que les #define présents dans un fichier source (.c ou .cpp) ou dans un
header (.h ou .hpp) sont remplacés par du code C/C++. À l'issue de cette étape, il n'y a donc plus, pour le
compilateur, d'instructions commençant par un #.
2) La compilation
Ensuite, le compilateur compile chaque fichier source (.c et .cpp), c'est-à-dire qu'il crée un fichier binaire
(.o) par fichier source, excepté pour le fichier contenant la fonction main. Cette phase constitue la
compilation proprement dite.
Ces deux premières étapes sont assurées par cc lorsqu'on utilise gcc/g++. Enfin le compilateur passe au
fichier contenant le main.

3) Le linkage
Enfin, le compilateur agrège chaque fichier .o avec les éventuels fichiers binaires des librairies qui sont
utilisées (fichiers .a et .so sous linux, fichiers .dll et .lib sous windows).
- Une librairie dynamique (.dll et .so) n'est pas recopiée dans l'exécutable final (ce qui signifie que le
programme est plus petit et bénéficiera des mises à jour de ladite librairie). En contrepartie, la librairie doit
être présente sur le système sur lequel tourne le programme.

- Une librairie statique (.a) est recopiée dans l'exécutable final ce qui fait que celui-ci est complètement
indépendant des librairies installées du le système sur lequel il sera recopié. En contrepartie, l'exécutable
est plus gros, il ne bénéficie pas des mises à jour de cette librairie etc...
Le linker vérifie en particulier que chaque fonction appelée dans le programme n'est pas seulement
déclarée (ceci est fait lors de la compilation) mais aussi implémentée (chose qu'il n'avait pas vérifié à ce
stade). Il vérifie aussi qu'une fonction n'est pas implémentée dans plusieurs fichiers .o.
Cette phase, appelée aussi édition de lien, constitue la phase finale pour obtenir un exécutable (noté .exe
sous windows, en général pas d'extension sous linux).
Cette étape est assurée par ld lorsqu'on utilise gcc/g++.
La première étape consiste à écrire le code source en langage C ou C++ (fichiers .c et .h en C et .cpp et .hpp en C++). Ensuite on lance une...

Installation d'un compilateur C et C++

Sous linux:

On utilise gcc et g++ en général. Pour l'installer on passe par son gestionnaire de paquet habituel. Par
exemple sous debian (ou sous une distribution basée sur debian) il suffit de taper en root ou avec un sudo
:
aptitude update
aptitude safe-upgrade
aptitude install gcc g++

On peut également installer de la même façon un environnement de développement comme par exemple
kdevelop (sous KDE) ou anjuta (sous gnome).

Sous windows:

On peut utiliser dev-cpp ou code::blocks: deux environnements de développement libres qui reposent sur
gcc et g++ :
www.bloodshed.net
www.codeblocks.org

 
Sous linux: On utilise gcc et g++ en général. Pour l'installer on passe par son gestionnaire de paquet habituel. Par exemple sous debian...

La compilation et les modules en C et en C++

Cet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la
programmation modulaire.
Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont
indépendantes du fait que l'on utilise windows ou linux. Toutefois on se placera plutôt dans le cadre de
linux afin de voir plus en détail tout se qui se passe lors de la compilation d'un programme C ou C++.

De manière générale, un compilateur a pour objectif de   convertir un fichier texte (contenant un code
source) en un fichier binaire (par exemple un exécutable). Une fois l'exécutable construit, on le lance
comme n'importe quel programme. Ce programme peut se lancer sans que l'on dispose du code source.
Un langage compilé (comme le C ou le C++) est à opposer à un langage interprété (par exemple un script
shell) ou pseudo-interprété (par exemple un programme python).
Dans le cadre du C, la compilation va transformer le code C d'un programme en code natif, à savoir une
suite d'instructions binaires directement compréhensibles par le processeur.
Cet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il p...

Featured Posts

    blogger