0% ont trouvé ce document utile (0 vote)
36 vues86 pages

Chaine de Compilation: Compilateur Warnings Compilation Séparée Précompilateur Make Le Edition de Liens Et Librairies

Le document présente la chaîne de compilation en C, incluant le rôle du compilateur, les avertissements, la compilation séparée, et l'utilisation de précompilateurs. Il souligne l'importance des avertissements pour éviter les erreurs et décrit les étapes de compilation, de la génération de fichiers objets à l'édition de liens. Enfin, il aborde les bonnes pratiques concernant l'utilisation des macros et des scripts pour automatiser le processus de compilation.

Transféré par

nizar samadi
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
36 vues86 pages

Chaine de Compilation: Compilateur Warnings Compilation Séparée Précompilateur Make Le Edition de Liens Et Librairies

Le document présente la chaîne de compilation en C, incluant le rôle du compilateur, les avertissements, la compilation séparée, et l'utilisation de précompilateurs. Il souligne l'importance des avertissements pour éviter les erreurs et décrit les étapes de compilation, de la génération de fichiers objets à l'édition de liens. Enfin, il aborde les bonnes pratiques concernant l'utilisation des macros et des scripts pour automatiser le processus de compilation.

Transféré par

nizar samadi
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Chaine de compilation

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

Le + répendu sous Linux

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:

Ne pas confondre IDE et Compilateur

éditer du texte/code génère le binaire


Emacs
QtCreator
MS Visual C++
Dev C++
Eclipse
Code::Blocks
ceci n'est pas
Anjuta un compilateur!
KDevelop

003
Compilateur

En pratique

mon_fichier.c mon_executable

Puis
$ ./mon_executable

004
Compilateur: Paramètres de GCC

gcc possède des paramètres:

- 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

sans option de Warning

avec option de 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

toujours vrai: boucle infinie


=0;

Ajout de warnings

$ gcc mon_fichier.c -Wall -Wextra

009
sentielle
Es !!
n

tio
TAN

Warnings : Bonnes pratiques

! ! No
OR
IMP

ir
o
A Sav

Toujours activer un maximum de Warnings


conteneurs de multiples warnings

-Wall -Wextra Indispensable!!

=> Toujours compiler avec $gcc -Wall -Wextra

D'autres Warnings très utiles:


(non compris dans -Wall ni -Wextra)

-Wfloat-equal -Wshadow -Wswitch-default -Wswitch-enum


-Wwrite-strings -Wpointer-arith -Wcast-qual -Wredundant-decls
-Winit-self

010
Warnings : Bonnes pratiques

Toujours activer un maximum de Warnings

Ne jamais se priver du travail du compilateur!

Si après analyse des Warnings inutiles gachent la lisibilité


(ex. unused variables)

annule ce Warning spécifique

Option: -Wno-<nom_warning>

ex. -Wall -Wextra -Wno-unused-variable

011
Warnings : Bonnes pratiques

gcc -Wall -Wextra -Wfloat-equal -Wshadow -Wswitch-default -Wswitch-enum -Wwrite-strings


-Wpointer-arith -Wcast-qual -Wredundant-decls -Winit-self

Trop long à écrire ?

1 unique fois dans un fichier


utilisez les scripts

script = lignes de commandes écrites dans un fichier


executées les unes derrières les autres

ex.

<nom_script>.sh

012
Script pour compiler

En pratique:

1. créez le fichier: dans le même repertoire que:


mon_script.sh
mon_programme.c

2. y inscrire:

3. rendez le fichier executable: $ chmod +x mon_script.sh

4. lancez le: $ ./mon_script.sh

013
:
Script pour compiler
En pratique:

Avec l'ensemble des paramètre de compilation:

utilisation d'une variable


déclaration d'une variable (+ lisible)

Note: En anglais: options de compilation = flags


options de compilation du compilateur C = Cflags

version générique:

014
sentielle
Es !!
n

tio
Options de debug TAN

! ! No
OR
IMP

ir
o
A Sav

-g Toujours compiler avec l'option de Debug


lors du developpement

Permet l'utilisation des debuggers (gdb,kdbg,ddd,valgrind, ...)

Pour résumer, CFLAGS minimales à toujours utiliser:

-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

1 Fichier: gcc -Wall -Wextra -g


fichier.c -o executable

fichier.c executable

2 Fichiers: ? ? executable
f1.c

f2.c exec1
exec2

017
Cas de 2 fichiers

Un executable => 1 point d'entrée (int main())

Cas 1:

f1.c f2.c

$ gcc -Wall -Wextra -g f1.c -o executable_1 2 créations


$ gcc -Wall -Wextra -g f2.c -o executable_2 d'executables
distincts

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

f2 ne contient pas de fonction: int main()


=> pas d'executable associé à f2 uniquement!

f2 agit en tant que "librairie" pour le code appelé dans f1

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 f1.c Option -c


@f2=?
f1.c f1.o

gcc -c -Wall -Wextra -g f2.c -o f2.o

Compilation de f2.c
Option -c
f2.c f2.o

Edition de liens, génération d'executable


gcc f1.o f2.o -o executable

+
f1.o f2.o executable

021
Fichier objet

gcc -c -Wall -Wextra -g f1.c -o f1.o


f1.c f1.o

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

fichier objet = fichier binaire


fichier non executable
peut contenir des liens vers des fonctions externes

022
Fichier objet

Pour visualiser un fichier binaire

ex.

Ouvrir le fichier avec xemacs ou emacs


$ xemacs fichier.o

Appuyez sur Alt+X: cherchez hexl-mode

ou

$ od -x fichier.o

023
Plusieurs sources, un executable

gcc -c pgm.c
pgm.c

pgm.o

gcc -c f1.c gcc pgm.o f1.o f2.o f3.o -o executable


f1.c
f1.h f1.o
une fois
gcc -c f2.c que tous les .o
sont créés executable
f2.c
f2.h f2.o

gcc -c f3.c
f3.c
f3.h f3.o

pas d'ordre (en //)


024
Plusieurs sources, un executable: script
gcc -c pgm.c
pgm.c

pgm.o

gcc -c f1.c gcc pgm.o f1.o f2.o f3.o -o executable


f1.c
f1.h f1.o
une fois
gcc -c f2.c que tous les .o
sont créés executable
f2.c
f2.h f2.o

gcc -c f3.c
f3.c
f3.h f3.o

pas d'ordre (en //)

mon_script_de_compilation.sh

025
Construction d'un fichier objet

f1.c f1.o

?#include ?
assembleur?

(C) (C) (assembleur) (binaire)

f1.c f1.i f1.s f1.o


préprocesseur compilation assembleur

026
Fichier assembleur

gcc -S f1.c

f1.c f1.s f1.o

Option -S

027
Chaine de compilation
Compilateur
Warnings
Compilation séparée
Précompilateur
Makefile
Edition de liens et librairies

028
Precompilateur

gcc -E f1.c > f1.i

f1.c f1.i f1.s f1.o

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 f1.s f1.o

Elimine tous les commentaires


=> inutile pour générer de l'assembleur

f1.c
f1.i

gcc -E f1.c > f1.i

Conclusion:
Ecrivez vos commentaires pour les humains, pas pour la machine!

030
Precompilateur
gcc -E f1.c > f1.i

f1.c f1.i f1.s f1.o


Remplace toute les Macros
#define
sentielle
Es !!
n

tio
N
RTA

! ! No
O
f1.c IMP f1.i

ir
o
A Sav

gcc -E f1.c > f1.i

Conclusion:
Centralisez vos constantes (tailles tableaux) dans des macros.

031
Precompilateur
gcc -E f1.c > f1.i

f1.c f1.i f1.s f1.o


Remplace toute les Macros
#define sentielle
Es !!
n

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

gcc -E f1.c > f1.i

Conclusion:
Pas de points-virgules dans les macros!.

032
Precompilateur
gcc -E f1.c > f1.i

f1.c f1.i f1.s f1.o


Remplace toute les Macros
#define
Les macros peuvent être des fonctions!

f1.c f1.i

gcc -E f1.c > f1.i

033
Precompilateur
gcc -E f1.c > f1.i

f1.c f1.i f1.s f1.o

Remplace toute les Macros


#define
Les macros peuvent être des fonctions!
Attention au principe du copié-collé des macros !!!

f1.c f1.i

gcc -E f1.c > f1.i

034
Precompilateur
gcc -E f1.c > f1.i

f1.c f1.i f1.s f1.o

Remplace toute les Macros


#define
Les macros peuvent être des fonctions!
Attention au principe du copié-collé des macros !!!

f1.c f1.i

gcc -E f1.c > f1.i

sentielle
Es !!
n

tio
TAN

! ! No
OR
IMP

ir
o
A Sav

=> Autour de chaque variable/expression: ajoutez des parenthèses

035
avancée !

Precompilateur
on !

i
ot
cée

!! N
n
Ava
i

le
Diffic

gcc -E f1.c > f1.i

f1.c f1.i f1.s f1.o


Remplace toute les Macros
#define
Les macros peuvent être des fonctions avancées !
f1.c

gcc -E f1.c > f1.i

f1.i

036
avancée !

Precompilateur
on !

i
ot
cée

!! N
n
Ava
i

le
Diffic

gcc -E f1.c > f1.i

Nouveau language?
f1.c f1.i f1.s f1.o
f1.c
+

f1.i

gcc -E 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

Avantage: Pas de types

Inconvénients: Difficile à écrire


Macro = Attention!
Difficile à debugger
Cas non prévues

Ne pas abuser des macros

Règles: Ne pas utiliser une macro si une fonction peut le faire!


Ne pas utiliser de macro si il y a ambiguité
Ne pas utiliser de macro si le code est moins lisible
038
Precompilateur
gcc -E f1.c > f1.i

f1.c f1.i f1.s f1.o


Quelques macros utiles

__LINE__,
__FUNCTION__,
__FILE__,
__DATE__

039
Precompilateur
gcc -E f1.c > f1.i

f1.c f1.i f1.s f1.o

Quelques macros utiles: exemple d'utilisation

f1.c f1.i

executable

gcc -E f1.c > f1.i

gcc -g -Wall -Wextra f1.c -o executable

Rem. __FUNCTION__ n'est pas une vraie macro, mais une variable liée à gcc
040
Precompilateur
gcc -E f1.c > f1.i

f1.c f1.i f1.s f1.o

Quelques macros utiles: exemple d'utilisation

Utile pour messages d'erreurs!

041
Precompilateur
gcc -E f1.c > f1.i

f1.c f1.i f1.s f1.o

avancée !
on !

Cas d'exemple complet: debug avancé

i
ot
cée

!! N
n
Ava
i

le
Diffic

042
Precompilateur
gcc -E f1.c > f1.i

f1.c f1.i f1.s f1.o


avancée !
on !

i
Cas d'exemple complet: debug avancé

ot
cée

!! N
n
Ava
i

le
Diffic

043
Precompilateur
gcc -E f1.c > f1.i

f1.c f1.i f1.s f1.o

avancée !
on !

Cas d'exemple complet: debug avancé

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

f1.c f1.i f1.s f1.o

Instructions contionnelles du precompilateur

#if <condition> #if <condition> #if <condition>


<...> <...> <...>
#endif #else #elif <conditon 2>
//si condition est vraie <...> <...>
#endif #else
//si condition est vraie
<...>
//sinon #endif
//si condition est vraie
//sinon, si condition 2 est vraie
//sinon

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

gcc -E f1.c > f1.i

f1.c f1.i f1.s f1.o

Exemple:

f1.c f1.i

gcc -E f1.c > f1.i

046
sentielle

Precompilateur
Es !!
n

tio
TAN

! ! No
OR
IMP

ir
o
A Sav

gcc -E f1.c > f1.i

Exemple: f1.c f1.i f1.s f1.o


f1.c
f1.i

gcc -E f1.c > f1.i

f2.c f2.i

gcc -E f2.c > f2.i

047
Precompilateur
gcc -E f1.c > f1.i

f1.c f1.i f1.s f1.o


Exemple:

gcc -E f1.c > f1.i

048
Precompilateur
gcc -E f1.c > f1.i

f1.c f1.i f1.s f1.o


Utilisation des conditionnelles+macro:

Pour la portabilitée entre systèmes

Pour le debug sentielle


Es !!
n

tio
N
RTA

! ! No
O
IMP

ir
A Sa vo

Attention: Ne pas utiliser pour l'optimisation


Réduit la lisibilité du code.
Si faisable avec une fonction: utiliser une fonction

049
Precompilateur
gcc -E f1.c > f1.i

f1.c f1.i f1.s f1.o

Macro: #include "fichier"


sentielle
Es !!
n

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

gcc -E f1.c > f1.i


050
Precompilateur
gcc -E f1.c > f1.i

f1.c f1.i f1.s f1.o


En-tête standards Es
sentielle
n !!

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

f1.c f1.i f1.s f1.o


En-tête standards
f1.c f1.i
...

...
gcc -E f1.c > f1.i

Note: #include "NOM" recherche fichier dans le repertoire locale

recherche fichier dans les repertoires systèmes


#include <NOM> (/usr/include/ ; /usr/local/include/ ; ...)

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

f1.c f1.i f1.s f1.o


En-tête standards
f1.c f1.i
...

...
gcc -E f1.c > f1.i

Note: Les fichiers d'en tête standards sont volumineux


=> N'inclure que ceux qui sont nécessaire

Les variables des fichiers standards commencent par _ ou __


=> Ne pas utiliser cette convention pour vos variables

053
Precompilateur
gcc -E f1.c > f1.i

f1.c f1.i f1.s f1.o


Inclusion multiples: include guard
voiture.h voiture.c

trajet.c
trajet.h

main.c

054
Precompilateur
gcc -E f1.c > f1.i

Inclusion multiples: include guard f1.c f1.i f1.s f1.o


sentielle
Es !!
n

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

gcc -E main.c > main.i

gcc -c main.c -Wall -Wextra -g

055
Precompilateur
gcc -E f1.c > f1.i

Inclusion multiples: include guard f1.c f1.i f1.s f1.o


voiture.h voiture.c

trajet.c
trajet.h

main.c

voiture.h trajet.h main.c

inclue voiture.h inclue voiture.h


inclue trajet.h

056
Precompilateur
gcc -E f1.c > f1.i

Inclusion multiples: include guard f1.c f1.i f1.s f1.o


voiture.h voiture.c

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

voiture.h trajet.h main.c

inclue voiture.h inclue voiture.h


inclue trajet.h

057
Precompilateur
gcc -E f1.c > f1.i

f1.c f1.i f1.s f1.o

Inclusion multiples: include guard


voiture.h
voiture.c

une unique inclusion


sentielle trajet.c
Es !!
n

tio
TAN

! ! No
O R
IMP

ir
o
A Sav

trajet.h

main.c

058
Precompilateur
gcc -E f1.c > f1.i

f1.c f1.i f1.s f1.o


Inclusion multiples: include guard
voiture.h voiture.c

trajet.c

main.i

trajet.h

main.c

gcc -E main.c > main.i

059
Precompilateur
gcc -E f1.c > f1.i

f1.c f1.i f1.s f1.o


Inclusion multiples: include guard

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

But: Nom éviter les collisions

Attention: Evitez les macros commencant par _


#ifndef _NOM_H
060
Precompilateur

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

Potentiellement puissant (va au dela du langage C)

A utiliser avec précaution

=> rend rapidement le code peu standard


= peu lisible

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

make: Outil d'automatisation de taches


Dépendance => Action à réaliser

Note: Makefile est indépendant de gcc!

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

Exemple de Makefile pour compiler du C

variable

Avantage par rapport à un script:


Ne compile que si necessaire

066
Makefile

Exemple de Makefile pour compiler du C

fichiers assembleurs
pas de commandes d'executions

L'appel à
$ make assembleur

génère les fichiers:


f1.s, f2.s, f3.s

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 f1.c gcc pgm.o f1.o f2.o f3.o -o executable


f1.c
f1.h f1.o
une fois
gcc -c f2.c que tous les .o
sont créés executable
f2.c
f2.h f2.o

gcc -c f3.c
f3.c
f3.h f3.o

pas d'ordre (en //)

implémentation des librairies externes


(ex: math, io, posix, ...)
069
Edition de liens et librairies
math.h

/usr/include/math.h

f1.c

$ gcc -c f1.c -o f1.o -Wall -Wextra -g


> OK
Edition de lien échoue

$ gcc f1.o -o mon_executable Ne trouve pas


l'implémentation de cos
f1.o: In function `main':
f1.c:(.text+0x1a): undefined reference to `cos'
collect2: error: ld returned 1 exit status 070
Edition de liens et librairies
math.h

libm.a

/usr/include/math.h

/usr/lib/m.a

f1.c contient l'équivalent de


math.o

$ gcc -c f1.c -o f1.o -Wall -Wextra -g


> OK se lier à libm

$ gcc f1.o -o mon_executable -lm


> OK
071
Edition de liens et librairies

Librairie statique:

lib<NOM>.a équivalent à f4.o


f1.o
f2.o

f3.o

archive de fichiers objets

Lors de l'édition de liens:

gcc fichier.o -l<NOM> équivalent à gcc fichier.o f1.o f2.o f3.o f4.o

=> Inclusion des binaires dans l'executable finale

072
Edition de liens et librairies
Exemple de librairie:

librairie vecteur:

v3.h
v3.c

programme utilisant la librairie:

main.c
073
Edition de liens et librairies
Exemple de librairie:
librairie vecteur:

v3.h
v3.c

programme utilisant la librairie:

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:

v3.h $ gcc -c main.c -o


#include main.o -g -Wall -Wextra
$ gcc main.o -lv3

executable
main.c main.o
074
Edition de liens et librairies

Librairies dynamiques:

lib<NOM>.so

Sont chargées dynamiquement à chaque execution


creation de la lib dynamique: une unique fois

$ gcc -shared

lib<NOM>.so
code source
librairie

$ gcc main.o -L. -l<NOM>


$ gcc -c main.c -o executable

main.c main.o
executable
075
Edition de liens et librairies

Librairies dynamiques:

lib<NOM>.so

Sont chargées dynamiquement à chaque execution

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

Sont chargées dynamiquement à chaque execution

sentielle
Es !!

Remarques:
n

tio
TAN

! ! No
OR
IMP

ir
o
A Sav

1. Si la lib change => l'executable change de comportement


Sans avoir à être recompilée
(update, MAJ, comportement, ...)

2. Si la lib disparait/est corrompu/n'est pas trouvée


=> l'executable ne peut pas être lancé

077
Edition de liens et librairies

Exemple concret de librairies dynamiques:


librairie vecteur:

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

2. Compilation et link avec la lib

v3.h $ gcc -c main.c -o


#include main.o -g -Wall -Wextra
$ gcc main.o -lv3 -L.

executable
main.c main.o
078
sentielle
Es !!
n

Edition de liens et librairies

tio
N
RTA

! ! No
O
IMP

ir
o
A Sav

Exemple concret de librairies dynamiques:


librairie vecteur:

v3.h
v3.c libv3.so
programme utilisant la librairie:

main.c

Utilisation de la librairie:

executable

repertoires déjà enregistrés


Par défaut: viens chercher la lib dans
/usr/lib/

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
ajout du repertoire local (.)

$ ./executable repertoire courant

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

$ gcc -c complex.c $ gcc -c complex.c


-g -Wall -Wextra -fPIC -o complex.o -g -Wall -Wextra -fPIC -o complex.o

$ gcc -shared complex.o -o libcomplex.so $ gcc -shared complex.o -o 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

$ gcc -c mon_programme.c -g -Wall -Wextra

$ gcc mon_programme.o -L. -lcomplex -o mon_executable

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

mon_executable complex.o complex.o


mon_programme.o

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

mon_executable complex.o complex.o


mon_programme.o

libcomplex.so libcomplex.so

cp
(erase version_1)
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

$ ./mon_executable

(principe du patch logiciel)

084
Edition de liens et librairies
version_1 version_2
Exemple:
complex.h complex.h
workspace
complex.c complex.c

mon_programme.c complex.o complex.o

libcomplex.so libcomplex.so

Si on ne veut pas copier/déplacer de fichiers:


sentielle
Es !!
n

tio
TAN

! ! No
OR
IMP

ir
o
A Sav

$ gcc -c mon_programme.c -I version_1/ -g -Wall -Wextra


mon_programme.o

$ gcc mon_programme.o -L version_1/ -l complex -o executable


executable

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:version_1/
$ ./executable 085

Vous aimerez peut-être aussi