Formation Unix/Linux (9)
Introduction `a la programmation C sous Unix
Olivier BOEBION
Mars 2004
1 Le langage C
Introduire un langage de d´eveloppement dans des travaux pratiques sur un syst`eme d’ex-
ploitation peut vous paraˆıtre curieux. Si vous devez travailler sur des syst`emes utilisant UNIX
ou Linux, vous constaterez que le langage C est incontournable. Le noyau, les diff´erents in-
terpr´eteurs de commande (csh, bash...), les commandes du syst`eme d’exploitation (ls, cp, rm ...)
sont ´ecrits avec le langage C. Si vous voulez enrichir le syst`eme avec une application nouvelle,
celle-ci sera le plus souvent ´ecrite avec ce langage et vous devrez parfois savoir la compiler.
Le langage C est un langage d’int´erˆet g´en´eral et il est portable. Il n’est pas affect´e `a un type
de programmation comme, par exemple, le Cobol pour les bases de donn´ee ou encore le For-
tran pour le calcul. Il offre la possibilit´e d’effectuer des op´erations de bas niveaux, op´erations qui
permettent l’´ecriture de systemes d’exploitation. Il possede un jeu d’instructions limit´e enrichie
par de nombreuses librairies. La grande majorit´e des syst`emes d’exploitation ont un compilateur
C et un effort de normalisation a ´et´e effectu´e `a travers la norme ANSI.
Le compilateur Gnu C est int´egr´e dans toutes les distributions Linux. C’est avec celui-ci
que nous allons travailler.
2 Construction d’un programme C
2.1 D´eroulement d’une compilation
L’´ecriture d’un programme C donne lieu `a la cr´eation d’un ou plusieurs fichiers sources
(extension .c) contenant les ´el´ements du langage. La cr´eation de fichiers header personnels
(extension .h) permet de d´efinir les fonctions cr´e´ees par l’utilisateur. Une fois ces fichiers prˆets,
l’appel aux compilateur peut se faire. Avec Gnu C, la ligne de commande minimale sera :
Cette ligne de commande cr´ee un fichier ex´ecutable a.out. Pour nommer pr´ecis´ement le
binaire, l’option -o du compilateur suivi du nom est utilis´ee :
gcc source.c
gcc -o binaire source.c
1
La cr´eation d’un fichier ex´ecutable a partir de fichiers sources en C fait appel a plusieurs
programmes comme le montre la figure 1.
Fig. 1 – D´eroulement d’une compilation
Le pr´ecompilateur (cpp) est d’abord lanc´e. Il supprime les commentaires et interpr´ete les
directives de compilations qui se trouvent dans les fichiers header ou sources.
L’appel au compilateur (cc ou gcc) permet en une ou deux passes de g´en´erer du code en
assembleur.
L’assembleur (as) cr´ee un fichier objet correspondant au fichier source qui sera trait´e ensuite
par l’´editeur de lien (ld). Cette derni`ere op´eration produit l’ex´ecutable final en r´eunissant les
fichiers objets de l’utilisateur et tous les fichiers objet des librairies n´ecessaires.
2
2.2 Les options du compilateur
Nous venons de voir une premi`ere option (-o) du compilateur. Il en existe de nombreuses
Publicité
(voir le manuel en ligne). Le tableau 1 vous pr´esente quelques unes de ces options.
Options Caract´eristiques
-v
-c
-o
-S
-L
-l
-I
Visualise toutes les actions effectu´ees lors d’une compilation.
Supprime l’´edition de lien. Seul le(s) fichier(s) .o est (sont) g´en´er´e(s).
Sp´ecifie le nom de l’ex´ecutable `a g´en´erer.
Ne g´en`ere pas le fichier ex´ecutable et cr´ee un fichier .s contenant le programme
en assembleur.
Indique un chemin de recherche suppl´ementaire `a l’´editeur de liens pour d’autres
librairies.
Indique une nouvelle librairie `a charger.
Indique un chemin de recherche suppl´ementaire pour des fichiers de d´efinition
(.h)
Tab. 1 – Quelques options du compilateur C
2.3 Exercice
Cr´eez le fichier source bonjour.c qui contient les instructions C suivantes :
include <stdio.h>
int main(void)
{
printf("bonjour\n");
exit(0);
}
Compilez-le pour cr´eer l’ex´ecutable bonjour et testez-le. Recompilez ce programme en
sp´ecifiant l’option -v et commentez ce qui s’affiche.
Trouvez l’option pour ne g´en´erer que le fichier assembleur puis objet de votre source.
3
3 Construction de librairie
Il est int´eressant de se construire des librairies contenant les fonctions les plus fr´equemment
utilis´ees plutˆot que de les r´e´ecrire `a chaque projet. Il suffit ensuite d’indiquer vos librairies au
moment de la compilation. Pour cela, les options -L et -l permettent respectivement d’inclure
un nouveau chemin de recherche pour l’´editeur de lien et d’indiquer le nom de librairie.
3.1 Exercice : Cr´eation d’une librairie
Vous trouverez ci-dessous 2 fonctions qui affichent ”Bonjour” et ”Au revoir” autant de fois
que le nombre pass´e en argument :
void bonjour(int nbre)
{
int i;
Publicité
for(i=0;i<nbre;i++) printf("Bonjour ...\n");
return;
}
void revoir(int nbre)
{
int i;
for(i=0;i<nbre;i++) printf("Au revoir ...\n");
return;
}
Placez ces fonctions dans des fichiers nomm´es bonjour.c et revoir.c. Compilez ces fichiers
afin de g´en´erer les fichiers objet :
gcc -c bonjour.c revoir.c.
Cr´eez la librairie libsalut.a `a l’aide de la commande ar :
ar r libsalut.a bonjour.o revoir.o
Vous pouvez v´erifier le contenu de votre librairie en tapant :
ar t libsalut.a
4
3.2 Exercice : Utilisation de la librairie
A partir de cette ´etape, vous pouvez d´ej`a utiliser ces fonctions en respectant quelques condi-
tions. La premiere de celles-ci est de placer libsalut.a dans le r´epertoire ou vous effectuez votre
compilation. La seconde est de compiler votre programme en sp´ecifiant le nom de la librairie.
Tapez le programme suivant dans le fichier exemple2.c :
#include <stdio.h>
void main(void)
{
int a=0;
while (a<l||a>5)
{
printf("Donnez un nombre entre 1 et 5 compris: ");
scanf("%d",&a);
printf("\n");
}
bonjour(a);
revoir(--a);
exit(0);
}
Compilez ce programme en ex´ecutant la ligne suivante :
gcc -o exemple exemple2.c libsalut.a
Vous pouvez ensuite placer toutes vos librairies dans un de vos r´epertoires (par exemple,
∼/librairies). Vous lancerez alors votre compilation de la mani`ere suivante :
gcc -o exemple exemple2.c -L∼/librairies -lsalut
4 Compilation s´epar´ee
4.1 Pr´esentation
Publicité
Lorsque vous r´ealisez de gros projets, vous devez d´ecouper ceux-ci en plusieurs programmes
sources. L’avantage est un gain de temps au moment de la compilation. Si une application est
constitu´ee des 3 fichiers sources source1.c, sourc2.c et sourc3.c la compilation d’un ex´ecutable
nomm´e exec est effectu´ee par la ligne suivante :
gcc -o exec sourc1.c sourc2.c sourc3.c
Nous connaissons l’option -c du compilateur qui permet de g´en´erer des fichiers objets sans
effectuer une ´edition de lien. Si vous modifiez un des fichiers source (par exemple, sourc3.c),
nous utilisons cette option pour ne compiler que le fichier modifi´e :
gcc -c sourc3.c
gcc -o exec sourc3.o sourc1.o sourc2.o
5
4.2 Exercices
Sur ”http ://www.obs-vlfr.fr/∼boebion/Unix”, t´el´echarger les fichiers menu.c, header.h,
date.c et fichier.c. Ces 4 fichiers compose une application qui permet d’afficher la date locale
du systeme et demande un nom de fichier pour indiquer la date de sa derniere modification.
Compilez cette application avec comme nom d’ex´ecutable prog et v´erifiez son bon fonction-
nement. Ajoutez ensuite la ligne suivante a la neuvieme ligne de fichier.c :
printf("Affichage de la date de modification d’un fichier.\n");
Qu’effectuez-vous comme compilations pour prendre en compte ce changement ?
5 Les fichiers make
5.1 Int´erˆet et syntaxe
Lorsqu’on r´ealise un projet en le d´ecoupant en plusieurs modules, vous constatez qu’il est
difficile de se rappeler ce qu’il faut recompiler apr`es une modification.
La commande make permet de maintenir un programme automatiquement. Pour cela, elle
utilisera un fichier de description nomm´e en g´en´eral makefile ou Makefile qui contient des
d´ependances et les actions `a mettre en oeuvre pour maintenir le programme.
La syntaxe de la commande make est la suivante :
make [-f nom fichier] [-arg optionnels] [ref..]
L’option -f indique le nom du fichier de description. En g´en´eral, la commande est lanc´ee
sans argument. Dans ce cas, elle recherche un fichier de description sur le r´epertoire courant.
Parmi les arguments optionnels, vous trouverez :
– -s (mode silencieux) : pas d’affichage des commandes avant ex´ecution ;
– -n : l’ensemble des commandes `a effectuer est affich´e mais non ex´ecut´e ;
– -d (mode debug) : le maximum d’informations est affich´e.
5.2 Contenu d’un fichier Makefile
Un fichier Makefile contient :
– les d´ependances entre les fichiers sources composant votre application ;
– les actions lanc´ees suivant la modification d’un de ces fichiers sources ;
– des variables qui permettent de fixer des chemins, des noms d’ex´ecutable etc...
6
5.3 Description du fichier Makefile
On ´ecrit un fichier Makefile en pla¸cant d’abord les variables g´en´erales. Les d´ependances de
l’ex´ecutable suivent ensuite avec l’action associ´ee. Si ce n’est pas le cas, vous devrez sp´ecifier le
Publicité
nom du programme a g´en´erer comme parametre de la commande make. On termine enfin le
fichier en d´eclarant toutes les autres d´ependances.
Il est conseill´e d’utiliser la tabulation lorsqu’on s´epare un champs d’un autre. La commande
make g`ere difficilement les espaces. Le fichier Makefile suivant permet de maintenir le projet
prog :
OBJS=menu.o fichier.o date.o
EXEC=prog
INSTALLDIR=.
LIBS=~/librairie
CC=gcc
prog: $(OBJS)
$(CC) $(OBJS) -o $(EXEC)
date.o: date.c header.h
$(CC) -c date.c
menu.o: menu.c header.h
$(CC) -c menu.c
fichier.o: fichier.c header.h
$(CC) -c fichier.c
install:
cp $(EXEC) $(INSTALLDIR)/prog2
clean:
rm *.o prog
EXEC est une variable contenant le nom de l’ex´ecutable `a g´en´erer. OBJS est une variable
contenant tous les fichiers objets n´ecessaires `a la construction de prog. Ce qui suit est la liste
des d´ependances et les actions associ´ees. Le ou les fichiers qui d´ependent d’autres fichiers sont
pr´ec´ed´es du caractere :. On peut interpr´eter de la maniere suivante :
– le fichier prog doit ˆetre compil´e si on modifie date.c, menu.c ou fichier.c. On peut
indiquer directement les fichiers objets .o car la commande make sait de mani`ere implicite
qu’un fichier .o d´epend directement d’un fichier .c. La modification d’un fichier .c lancera
donc automatiquement sa compilation en .o et la compilation de prog par la commande
qui suit cette ligne.
– les fichiers menu.o, fichier.o et date.o d´ependent d’une modification de header.h. Si
ce dernier est modifi´e, une compilation compl`ete pour g´en´erer prog sera effectu´ee.
– Les lignes clean et install ne poss`edent pas de d´ependances. Seules des actions sont
d´efinies. En faisant make clean, vous supprimerez les fichiers prog et .o.
5.4 Exercices
Cr´eez ce fichier Makefile. Supprimez tous les fichiers objets de votre r´epertoire et lancez la
commande make. Modifiez les diff´erents fichiers sources et relancez de nouveau make.
7