Chaine de Compilation: Compilateur Warnings Compilation Séparée Précompilateur Make Le Edition de Liens Et Librairies
Chaine de Compilation: Compilateur Warnings Compilation Séparée Précompilateur Make Le Edition de Liens Et Librairies
Compilateur
Warnings
Compilation séparée
Précompilateur
Makefile
Edition de liens et librairies
000
Chaine de compilation
Code (C)
(=langage humain)
Compilateur
Fichier executable
(=binaire)
(Windows: .exe
Linux: nom quelconque)
001
Compilateur
gcc http://gcc.gnu.org/
(C, C++,Obj-C,Fortran,Ada,Go)
GNU Compiler Collection
D'autres existent:
Nwcc Note:
Clang Compilateur C++ compatibles
Quick C (Microsoft) BorlandC++
Intel C++ Compiler
Turbo C (Embarcadero) Visual Studio
Turbo C++
XL C (IBM) ProDev
Solaris Studio
002
Compilateur
Remarque:
003
Compilateur
En pratique
mon_fichier.c mon_executable
Puis
$ ./mon_executable
004
Compilateur: Paramètres de GCC
- Warnings
- Debug
- Optimisation
beaucoup d'options!
- Chemins d'acces
- Lien avec librairies
- Constantes
- ...
http://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html
005
Chaine de compilation
Compilateur
Warnings
Compilation séparée
Précompilateur
Makefile
Edition de liens et librairies
006
Compilateur
Ex: Warning
en francais:
compilation.c, ligne 17. Warning 'a' est utilisé sans être initialisé dans
cette fonction.
Warning = Aide pour le programmeur
= Lisible pour le programmeur
= Evite les erreurs "silentieuses"
007
Warnings typiques:
Sans warnings
$ gcc mon_fichier.c
compile
Fonctionne?
=0;
008
Warnings typiques:
pas de retour
adresse temporaire
depassement tableau
Ajout de warnings
009
sentielle
Es !!
n
tio
TAN
! ! No
OR
IMP
ir
o
A Sav
010
Warnings : Bonnes pratiques
Option: -Wno-<nom_warning>
011
Warnings : Bonnes pratiques
ex.
<nom_script>.sh
012
Script pour compiler
En pratique:
2. y inscrire:
013
:
Script pour compiler
En pratique:
version générique:
014
sentielle
Es !!
n
tio
Options de debug TAN
! ! No
OR
IMP
ir
o
A Sav
-Wall -Wextra -g
015
Chaine de compilation
Compilateur
Warnings
Compilation séparée
Précompilateur
Makefile
Edition de liens et librairies
016
Compilation séparée
fichier.c executable
2 Fichiers: ? ? executable
f1.c
f2.c exec1
exec2
017
Cas de 2 fichiers
Cas 1:
f1.c f2.c
executable_1 executable_2
$ ./executable_1 $ ./executable_2
> Je suis f1.c > Je suis f2.c
018
Cas de 2 fichiers
Cas 2:
f2.h
f1.c
f2.c
019
Cas de 2 fichiers: compilation séparée
Cas 2:
f2.h
f1.c
f2.c
Principe:
On compile tout ce qu'on peut de f1
=> cad: tout sauf la fonction de f2 (adresse à définir)
@f2=?
f1.c f1.o
On compile tout ce qu'on peut de f2
=> cad: tout
f2.c f2.o
On rassemble les 2 binaires + complète l'adresse de fonction définitive
@f2=
+
f1.o f2.o executable
020
Cas de 2 fichiers: compilation séparée
Cas 2, ligne de commande: gcc -c -Wall -Wextra -g f1.c -o f1.o
Compilation de f2.c
Option -c
f2.c f2.o
+
f1.o f2.o executable
021
Fichier objet
Option -c indique:
génère un binaire du code
ne génère pas d'executable
s'arrête avant l'étape d'édition de lien
022
Fichier objet
ex.
ou
$ od -x fichier.o
023
Plusieurs sources, un executable
gcc -c pgm.c
pgm.c
pgm.o
gcc -c f3.c
f3.c
f3.h f3.o
pgm.o
gcc -c f3.c
f3.c
f3.h f3.o
mon_script_de_compilation.sh
025
Construction d'un fichier objet
f1.c f1.o
?#include ?
assembleur?
026
Fichier assembleur
gcc -S f1.c
Option -S
027
Chaine de compilation
Compilateur
Warnings
Compilation séparée
Précompilateur
Makefile
Edition de liens et librairies
028
Precompilateur
Option -E
Precompilateur =
Convertion du code C en un autre code C (plus simple à compiler)
029
Precompilateur
gcc -E f1.c > f1.i
f1.c
f1.i
Conclusion:
Ecrivez vos commentaires pour les humains, pas pour la machine!
030
Precompilateur
gcc -E f1.c > f1.i
tio
N
RTA
! ! No
O
f1.c IMP f1.i
ir
o
A Sav
Conclusion:
Centralisez vos constantes (tailles tableaux) dans des macros.
031
Precompilateur
gcc -E f1.c > f1.i
tio
Attention: Les macros sont directement copiés collés! RTA
N
! ! No
IM PO
=> Pas de points-virgules (;) !
ir
o
A Sav
f1.c f1.i
Conclusion:
Pas de points-virgules dans les macros!.
032
Precompilateur
gcc -E f1.c > f1.i
f1.c f1.i
033
Precompilateur
gcc -E f1.c > f1.i
f1.c f1.i
034
Precompilateur
gcc -E f1.c > f1.i
f1.c f1.i
sentielle
Es !!
n
tio
TAN
! ! No
OR
IMP
ir
o
A Sav
035
avancée !
Precompilateur
on !
i
ot
cée
!! N
n
Ava
i
le
Diffic
f1.i
036
avancée !
Precompilateur
on !
i
ot
cée
!! N
n
Ava
i
le
Diffic
Nouveau language?
f1.c f1.i f1.s f1.o
f1.c
+
f1.i
037
Precompilateur
gcc -E f1.c > f1.i
sentielle
Es !!
n
Synthèse Macros:
T
tio
N
RTA
! ! No
IMP
O f1.c f1.i f1.s f1.o
ir
o
A Sav
__LINE__,
__FUNCTION__,
__FILE__,
__DATE__
039
Precompilateur
gcc -E f1.c > f1.i
f1.c f1.i
executable
Rem. __FUNCTION__ n'est pas une vraie macro, mais une variable liée à gcc
040
Precompilateur
gcc -E f1.c > f1.i
041
Precompilateur
gcc -E f1.c > f1.i
avancée !
on !
i
ot
cée
!! N
n
Ava
i
le
Diffic
042
Precompilateur
gcc -E f1.c > f1.i
i
Cas d'exemple complet: debug avancé
ot
cée
!! N
n
Ava
i
le
Diffic
043
Precompilateur
gcc -E f1.c > f1.i
avancée !
on !
i
ot
cée
!! N
n
Ava
i
le
Diffic
Debug simple
on sait d'où viens l'erreur
Affichage:
Erreur (norme nulle pour k=4): ligne 27,
fonction [normalise_tableau_de_vecteur], fichier [compilation.c]
044
Precompilateur
gcc -E f1.c > f1.i
sentielle
#ifdef <variable> #ifndef <variable> n
Es !!
tio
<...> <...> TAN
! ! No
O R
#endif #endif IMP
ir
o
A Sav
//si variable definie //si variable non definie
045
sentielle
Es
Precompilateur
n !!
tio
TAN
! ! No
OR
IMP
ir
o
A Sav
Exemple:
f1.c f1.i
046
sentielle
Precompilateur
Es !!
n
tio
TAN
! ! No
OR
IMP
ir
o
A Sav
f2.c f2.i
047
Precompilateur
gcc -E f1.c > f1.i
048
Precompilateur
gcc -E f1.c > f1.i
tio
N
RTA
! ! No
O
IMP
ir
A Sa vo
049
Precompilateur
gcc -E f1.c > f1.i
tio
TAN
! ! No
Copie-colle le contenu d'un fichier OR
IMP
ir
o
mon_fichier f1.i A Sav
f1.c
execution:
bonjour 36
tio
N
RTA
! ! No
IM PO
ir
o
A Sav
f1.c f1.i
...
...
gcc -E f1.c > f1.i
051
Precompilateur
gcc -E f1.c > f1.i
...
gcc -E f1.c > f1.i
sentielle
Es !!
n
T
tio
N
RTA
! ! No
IM PO
Pour inclure d'autres chemins:
ir
o
A Sav
gcc -I<CHEMIN>
052
Precompilateur
gcc -E f1.c > f1.i
...
gcc -E f1.c > f1.i
053
Precompilateur
gcc -E f1.c > f1.i
trajet.c
trajet.h
main.c
054
Precompilateur
gcc -E f1.c > f1.i
NT
tio
voiture.h TA
! ! No
voiture.c OR
IMP
ir
o
A Sav
trajet.h
trajet.c main.i
main.c
inclusion de voiture.h
inclusion de trajet.h
055
Precompilateur
gcc -E f1.c > f1.i
trajet.c
trajet.h
main.c
056
Precompilateur
gcc -E f1.c > f1.i
trajet.c
Solution 1:
trajet.h
N'inclure que trajet.h dans main.c
=> Ingérable pour un grand projet
main.c
Solution 2:
Compilateur n'inclue pas voiture.h deux fois
=> Principe des includes guards
057
Precompilateur
gcc -E f1.c > f1.i
tio
TAN
! ! No
O R
IMP
ir
o
A Sav
trajet.h
main.c
058
Precompilateur
gcc -E f1.c > f1.i
trajet.c
main.i
trajet.h
main.c
059
Precompilateur
gcc -E f1.c > f1.i
Bonne pratique:
Pour tout fichier d'en-tête de nom: NOM.h
Placez un include guard
#ifndef NOM_H
#define NOM_H Autres possibilitées:
#ifndef INCLUDE_GUARD_NOM_H
... #ifndef NOM
#endif
Exemple réel:
fichier unistd.h
...
061
sentielle
Es
Precompilateur
n !!
tio
N
RTA
! ! No
O
IMP
ir
o
A Sav
Synthèse précompilateur
Bonne pratique:
N'utilisez que les règles standards:
* include guard
* #ifdef => portabilité, debug.
* pas d'optimisation, préférez les fonctions aux macros
062
Chaine de compilation
Compilateur
Warnings
Compilation séparée
Précompilateur
Makefile
Edition de liens et librairies
063
Makefile
Makefile
064
sentielle
Es !!
n
tio
TAN
Makefile
! ! No
OR
IMP
ir
o
A Sav
Exemple de Makefile
L'appel à: $ make
génère:
partie_1.txt partie_2.txt mon_rapport.txt
065
sentielle
Es !!
n
tio
TAN
! ! No
Makefile IMP
OR
ir
o
A Sav
variable
066
Makefile
fichiers assembleurs
pas de commandes d'executions
L'appel à
$ make assembleur
067
Chaine de compilation
Compilateur
Warnings
Compilation séparée
Précompilateur
Makefile
Edition de liens et librairies
068
Edition de liens et librairies
gcc -c pgm.c
pgm.c
pgm.o
gcc -c f3.c
f3.c
f3.h f3.o
/usr/include/math.h
f1.c
libm.a
/usr/include/math.h
/usr/lib/m.a
Librairie statique:
f3.o
gcc fichier.o -l<NOM> équivalent à gcc fichier.o f1.o f2.o f3.o f4.o
072
Edition de liens et librairies
Exemple de librairie:
librairie vecteur:
v3.h
v3.c
main.c
073
Edition de liens et librairies
Exemple de librairie:
librairie vecteur:
v3.h
v3.c
main.c
1. Création de la librairie:
$ gcc -c v3.c -o v3.o -g -Wall -Wextra
v3.h v3.c
v3.o
libv3.a
Une unique fois
$ ar -rv libv3.a v3.o
2. Utilisation de la librairie:
executable
main.c main.o
074
Edition de liens et librairies
Librairies dynamiques:
lib<NOM>.so
$ gcc -shared
lib<NOM>.so
code source
librairie
main.c main.o
executable
075
Edition de liens et librairies
Librairies dynamiques:
lib<NOM>.so
Lors de l'execution:
lib<NOM>.so
$ ./executable
viens lire
et charger le contenu de la lib
executable
076
Edition de liens et librairies
Librairies dynamiques:
lib<NOM>.so
sentielle
Es !!
Remarques:
n
tio
TAN
! ! No
OR
IMP
ir
o
A Sav
077
Edition de liens et librairies
v3.h
v3.c libv3.so
programme utilisant la librairie:
main.c
1. Création de la librairie:
$ gcc v3.c -fPIC -o v3.o
-g -Wall -Wextra $ gcc -shared v3.o -o libv3.so
v3.h v3.c
v3.o
libv3.so
Une unique fois
executable
main.c main.o
078
sentielle
Es !!
n
tio
N
RTA
! ! No
O
IMP
ir
o
A Sav
v3.h
v3.c libv3.so
programme utilisant la librairie:
main.c
Utilisation de la librairie:
executable
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
ajout du repertoire local (.)
079
Edition de liens et librairies
Exemple:
version_2
version_1
complex.h
complex.h
complex.c
complex.c
complex.o
complex.o
libcomplex.so
libcomplex.so
080
Edition de liens et librairies
version_1 version_2
Exemple:
complex.h complex.h
complex.c complex.c
cp
complex.o complex.o
workspace libcomplex.so
libcomplex.so
complex.h
mon_programme.c
081
Edition de liens et librairies
version_1 version_2
Exemple:
complex.h complex.h
complex.c complex.c
complex.o complex.o
workspace libcomplex.so
libcomplex.so
cp
complex.h
libcomplex.so
mon_programme.c
mon_executable
mon_programme.o
082
Edition de liens et librairies
version_1 version_2
Exemple:
complex.h complex.h
workspace
complex.c complex.c
complex.h
libcomplex.so
mon_programme.c
libcomplex.so libcomplex.so
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
$ ./mon_executable
083
Edition de liens et librairies
version_1 version_2
Exemple:
complex.h complex.h
workspace
complex.c complex.c
complex.h
libcomplex.so
mon_programme.c
libcomplex.so libcomplex.so
cp
(erase version_1)
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
$ ./mon_executable
084
Edition de liens et librairies
version_1 version_2
Exemple:
complex.h complex.h
workspace
complex.c complex.c
libcomplex.so libcomplex.so
tio
TAN
! ! No
OR
IMP
ir
o
A Sav
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:version_1/
$ ./executable 085