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



Documents pareils
Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Cours Langage C/C++ Programmation modulaire

Quelques éléments de compilation en C et makefiles

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Systeme d'exploitation

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

Environnements de développement (intégrés)

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Introduction au langage C

Chaîne de production d un programme

I. Introduction aux fonctions : les fonctions standards

Tutoriel code::blocks

Algorithmique et Programmation, IMA

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Chapitre 10 : Logiciels

Cours Informatique Master STEP


Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Microsoft OSQL OSQL ou l'outil de base pour gérer SQL Server

Programmation C++ (débutant)/instructions for, while et do...while

Outils pour les réseaux de neurones et contenu du CD-Rom

UE Programmation Impérative Licence 2ème Année

Java Licence professionnelle CISII,

Installation LTE-SIM. Simulation du réseau 4G (LTE-SIM) en vue d optimiser les ressources spectrales de l opérateur.

Cours Programmation Système

Plan global Outils de développement et compilation. Plan. Objectifs des outils présentés. IDE, GCC/Clang, ASAN, perf, valgrind, GDB.

Projet de développement. Introduction à Eclipse. Application à votre projet. Philippe Collet. Organisation. Cours 1 : principes généraux - svn

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

1. Structure d'un programme FORTRAN 95

Environnements et Outils de Développement Cours 1 Introduction

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Reproductibilité des expériences de l article "Analyse et réduction du chemin critique dans l exécution d une application"

Conventions d écriture et outils de mise au point

TP1. Outils Java Eléments de correction

IBM SPSS Statistics Version 22. Instructions d'installation sous Windows (licence nominative)

Projet de développement

Outils pour la pratique

CA Desktop Migration Manager

AUVRAY Clément (168187) HOMBERGER Alexandre (186897) GLADE. Langages, outils et méthodes pour la programmation avancée Page 1 sur 12

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

REALISATION d'un. ORDONNANCEUR à ECHEANCES

Optimisation de logiciels de modélisation sur centre de calcul

Titre: Version: Dernière modification: Auteur: Statut: Licence:

Programmation en langage C

1) Installation de Dev-C++ Téléchargez le fichier devcpp4990setup.exe dans un répertoire de votre PC, puis double-cliquez dessus :

Symantec Backup Exec 12.5 for Windows Servers. Guide d'installation rapide

Notes de Cours - Programmation Pascal Ferraro

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence

Initiation à la programmation en Python

Stockage du fichier dans une table mysql:

Cours de C/C++ par la pratique. Hugues Talbot

Introduction à l algorithmique et à la programmation M1102 CM n 3

Application 1- VBA : Test de comportements d'investissements

1 TD 2 : Construction d'une chier Acrobat et envoi par

TP Bases de données réparties

Construction de logiciel et packaging

Serveur Acronis Backup & Recovery 10 pour Linux. Update 5. Guide d'installation

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Addenda du Guide de l administrateur

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Guide de formation avec cas pratiques. Programmation. Philippe Moreau Patrick Morié. Daniel-Jean David

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

TP : Shell Scripts. 1 Remarque générale. 2 Mise en jambe. 3 Avec des si. Systèmes et scripts

Informatique I. Sciences et Technologies du Vivant (Semestre 1)

Notions fondamentales du langage C# Version 1.0

Chap III : Les tableaux

Hadoop / Big Data. Benjamin Renaut <renaut.benjamin@tokidev.fr> MBDS

«Vous éditez, nous archivons!»

Hadoop / Big Data. Benjamin Renaut <renaut.benjamin@tokidev.fr> MBDS

Évaluation et implémentation des langages

MRTG & RRD Tool. Multi Router Traffic Grapher

Notes du cours 4M056 Programmation en C et C++ Vincent Lemaire et Damien Simon

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Procédure de sauvegarde - Cobian Backup

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

MICROINFORMATIQUE NOTE D APPLICATION 1 (REV. 2011) ARITHMETIQUE EN ASSEMBLEUR ET EN C

A.P.I. Kuka Manuel de l utilisateur Version 0.0.5

Compression de Données - Algorithme de Huffman Document de Conception

Télécom Nancy Année

Les chaînes de caractères

Studio. HERITIER Emmanuelle PERSYN Elodie. SCHMUTZ Amandine SCHWEITZER Guillaume

Mysql. Les requêtes préparées Prepared statements

Informatique industrielle A Systèmes temps-réel J.F.Peyre. Partie I : Introduction

Le prototype de la fonction main()

Testez votre installation. Créer un répertoire vide

Chapitre 2 Devine mon nombre!

Projet Administration Réseaux

Alfresco Guide Utilisateur

Solutions du chapitre 4

Introduction à l héritage en C++

Chapitre I Notions de base et outils de travail

TP, première séquence d exercices.

Comment créer et utiliser une fonction

3IS - Système d'exploitation linux - Programmation système

Transcription:

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 GNU Compiler Collection http://gcc.gnu.org/ (C, C++,Obj-C,Fortran,Ada,Go) Le + répendu sous Linux D'autres existent: Nwcc Clang Quick C (Microsoft) Turbo C (Embarcadero) XL C (IBM) Note: Compilateur C++ compatibles BorlandC++ Intel C++ Compiler Visual Studio Turbo C++ ProDev Solaris Studio 002

Compilateur Remarque: Ne pas confondre IDE et Compilateur éditer du texte/code Emacs QtCreator MS Visual C++ Dev C++ Eclipse Code::Blocks Anjuta KDevelop génère le binaire ceci n'est pas un compilateur! 003

En pratique Compilateur mon_fichier.c mon_executable Puis $./mon_executable 004

Compilateur: Paramètres de GCC gcc possède des paramètres: - Warnings - Debug - Optimisation - Chemins d'acces - Lien avec librairies - Constantes -... beaucoup d'options! 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

Ex: Warning Compilateur 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

Warnings : Bonnes pratiques!! Notion Essentielle!! IMPORTANT A Savoir 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 ex. script = lignes de commandes écrites dans un fichier executées les unes derrières les autres <nom_script>.sh 012

Script pour compiler En pratique: 1. créez le fichier: 2. y inscrire: mon_script.sh dans le même repertoire que: mon_programme.c 3. rendez le fichier executable: $ chmod +x mon_script.sh 4. lancez le: $./mon_script.sh 013

En pratique: Script pour compiler Avec l'ensemble des paramètre de compilation: déclaration d'une variable (+ lisible) utilisation d'une variable Note: En anglais: options de compilation = flags options de compilation du compilateur C = Cflags version générique: 014

Options de debug!! Notion Essentielle!! IMPORTANT A Savoir -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: fichier.c gcc -Wall -Wextra -g fichier.c -o executable executable 2 Fichiers:?? executable f2.c exec1 exec2 017

Cas de 2 fichiers Un executable => 1 point d'entrée (int main()) Cas 1: f2.c $ gcc -Wall -Wextra -g -o executable_1 $ gcc -Wall -Wextra -g f2.c -o executable_2 2 créations d'executables distincts $./executable_1 > Je suis executable_1 executable_2 $./executable_2 > Je suis f2.c 018

Cas de 2 fichiers Cas 2: f2.h 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 Principe: On compile tout ce qu'on peut de f1 => cad: tout sauf la fonction de f2 (adresse à définir) f2.c On compile tout ce qu'on peut de f2 => cad: tout f2.c f1.o f2.o @f2=? 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 -o f1.o Compilation de f1.o @f2=? Option -c gcc -c -Wall -Wextra -g f2.c -o f2.o Compilation de f2.c f2.c f2.o Option -c Edition de liens, génération d'executable gcc f1.o f2.o -o executable + f1.o f2.o executable 021

Fichier objet f1.o gcc -c -Wall -Wextra -g -o 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 pgm.c gcc -c pgm.c pgm.o gcc -c gcc pgm.o f1.o f2.o f3.o -o executable f1.h f1.o f2.c f2.h gcc -c f2.c f2.o une fois que tous les.o sont créés executable gcc -c f3.c f3.c f3.h f3.o pas d'ordre (en //) 024

Plusieurs sources, un executable: script pgm.c gcc -c pgm.c pgm.o gcc -c gcc pgm.o f1.o f2.o f3.o -o executable f1.h f1.o f2.c f2.h gcc -c f2.c f2.o une fois que tous les.o sont créés executable 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.o?#include? assembleur? (C) (C) (assembleur) (binaire) f1.s f1.o préprocesseur compilation assembleur 026

Fichier assembleur gcc -S 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.s f1.o Option -E Precompilateur = Convertion du code C en un autre code C (plus simple à compiler) 029

Precompilateur gcc -E > f1.s f1.o Elimine tous les commentaires => inutile pour générer de l'assembleur gcc -E > Conclusion: Ecrivez vos commentaires pour les humains, pas pour la machine! 030

Precompilateur gcc -E > Remplace toute les Macros #define f1.s f1.o!! Notion Essentielle!! IMPORTANT A Savoir gcc -E > Conclusion: Centralisez vos constantes (tailles tableaux) dans des macros. 031

Precompilateur gcc -E > Remplace toute les Macros #define f1.s Attention: Les macros sont directement copiés collés! => Pas de points-virgules (;)! A Savoir!! Notion Essentielle!! IMPORTANT f1.o gcc -E > Conclusion: Pas de points-virgules dans les macros!. 032

Precompilateur gcc -E > Remplace toute les Macros #define f1.s f1.o Les macros peuvent être des fonctions! gcc -E > 033

Precompilateur gcc -E > Remplace toute les Macros #define Les macros peuvent être des fonctions! Attention au principe du copié-collé des macros!!! f1.s f1.o gcc -E > 034

Precompilateur gcc -E > Remplace toute les Macros #define Les macros peuvent être des fonctions! Attention au principe du copié-collé des macros!!! f1.s f1.o gcc -E >!! Notion Essentielle!! IMPORTANT => Autour de chaque variable/expression: ajoutez des parenthèses A Savoir 035

Precompilateur!! Notion avancée!! Avancée Difficile gcc -E > Remplace toute les Macros #define f1.s f1.o Les macros peuvent être des fonctions avancées! gcc -E > 036

Precompilateur!! Notion avancée!! Avancée Difficile gcc -E > Nouveau language? + f1.s f1.o gcc -E > 037

Precompilateur gcc -E > Synthèse Macros:!! Notion Essentielle!! IMPORTANT A Savoir f1.s f1.o Avantage: Pas de types Inconvénients: Difficile à écrire Difficile à debugger Cas non prévues Macro = Attention! 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 > Quelques macros utiles f1.s f1.o LINE, FUNCTION, FILE, DATE 039

Precompilateur gcc -E > f1.s f1.o Quelques macros utiles: exemple d'utilisation executable gcc -E > gcc -g -Wall -Wextra -o executable Rem. FUNCTION n'est pas une vraie macro, mais une variable liée à gcc 040

Precompilateur gcc -E > Quelques macros utiles: exemple d'utilisation f1.s f1.o Utile pour messages d'erreurs! 041

Precompilateur gcc -E > f1.s f1.o Cas d'exemple complet: debug avancé!! Notion avancée!! Avancée Difficile 042

Precompilateur gcc -E > f1.s f1.o Cas d'exemple complet: debug avancé!! Notion avancée!! Avancée Difficile 043

Precompilateur gcc -E > f1.s f1.o Cas d'exemple complet: debug avancé!! Notion avancée!! Avancée Difficile 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.s f1.o Instructions contionnelles du precompilateur #if <condition> <...> #endif //si condition est vraie #if <condition> <...> #else <...> #endif //si condition est vraie //sinon #if <condition> <...> #elif <conditon 2> <...> #else <...> #endif //si condition est vraie //sinon, si condition 2 est vraie //sinon #ifdef <variable> <...> #endif //si variable definie #ifndef <variable> <...> #endif //si variable non definie!! Notion Essentielle!! IMPORTANT A Savoir 045

Precompilateur!! Notion Essentielle!! IMPORTANT A Savoir gcc -E > f1.s f1.o Exemple: gcc -E > 046

Precompilateur!! Notion Essentielle!! IMPORTANT A Savoir gcc -E > Exemple: f1.s f1.o gcc -E > f2.c f2.i gcc -E f2.c > f2.i 047

Precompilateur gcc -E > Exemple: f1.s f1.o gcc -E > 048

Precompilateur gcc -E > Utilisation des conditionnelles+macro: f1.s f1.o Pour la portabilitée entre systèmes Pour le debug!! Notion Essentielle!! IMPORTANT A Savoir 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.s Macro: #include "fichier" Copie-colle le contenu d'un fichier mon_fichier!! Notion Essentielle!! IMPORTANT A Savoir f1.o execution: bonjour 36 gcc -E > 050

Precompilateur gcc -E > En-tête standards f1.s f1.o!! Notion Essentielle!! IMPORTANT A Savoir... gcc -E >... 051

Precompilateur gcc -E > En-tête standards f1.s f1.o... gcc -E >... Note: #include "NOM" #include <NOM> recherche fichier dans le repertoire locale recherche fichier dans les repertoires systèmes (/usr/include/ ; /usr/local/include/ ;...)!! Notion Essentielle!! IMPORTANT A Savoir Pour inclure d'autres chemins: gcc -I<CHEMIN> 052

Precompilateur gcc -E > En-tête standards f1.s f1.o... gcc -E >... 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 > Inclusion multiples: include guard f1.s f1.o voiture.h voiture.c trajet.h trajet.c main.c 054

Precompilateur gcc -E > Inclusion multiples: include guard f1.s f1.o voiture.h voiture.c!! Notion Essentielle!! IMPORTANT A Savoir 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 > Inclusion multiples: include guard f1.s f1.o voiture.h voiture.c trajet.h trajet.c main.c voiture.h trajet.h inclue voiture.h main.c inclue voiture.h inclue trajet.h 056

Precompilateur gcc -E > Inclusion multiples: include guard f1.s f1.o voiture.h voiture.c trajet.h main.c trajet.c Solution 1: N'inclure que trajet.h dans main.c => Ingérable pour un grand projet Solution 2: Compilateur n'inclue pas voiture.h deux fois => Principe des includes guards voiture.h trajet.h inclue voiture.h main.c inclue voiture.h inclue trajet.h 057

Precompilateur gcc -E > Inclusion multiples: include guard f1.s f1.o voiture.h une unique inclusion voiture.c!! Notion Essentielle!! IMPORTANT A Savoir trajet.c trajet.h main.c 058

Precompilateur gcc -E > Inclusion multiples: include guard f1.s f1.o voiture.h voiture.c trajet.c main.i trajet.h main.c gcc -E main.c > main.i 059

Precompilateur gcc -E > Inclusion multiples: include guard f1.s f1.o Bonne pratique: Pour tout fichier d'en-tête de nom: NOM.h Placez un include guard #ifndef NOM_H #define NOM_H... #endif Autres possibilitées: #ifndef INCLUDE_GUARD_NOM_H #ifndef NOM But: Nom éviter les collisions Attention: Evitez les macros commencant par _ #ifndef _NOM_H 060

Precompilateur Exemple réel: fichier unistd.h... 061

Precompilateur!! Notion Essentielle!! IMPORTANT A Savoir 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

Makefile!! Notion Essentielle!! IMPORTANT A Savoir Exemple de Makefile L'appel à: $ make génère: partie_1.txt partie_2.txt mon_rapport.txt 065

Makefile!! Notion Essentielle!! IMPORTANT A Savoir 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 pgm.c gcc -c pgm.c pgm.o gcc -c gcc pgm.o f1.o f2.o f3.o -o executable f1.h f1.o f2.c f2.h gcc -c f2.c f2.o une fois que tous les.o sont créés executable 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 $ gcc -c -o f1.o -Wall -Wextra -g > OK $ gcc f1.o -o mon_executable f1.o: In function `main': :(.text+0x1a): undefined reference to `cos' collect2: error: ld returned 1 exit status Edition de lien échoue Ne trouve pas l'implémentation de cos 070

Edition de liens et librairies math.h libm.a /usr/include/math.h /usr/lib/m.a contient l'équivalent de math.o $ gcc -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 à f1.o f2.o f4.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

Exemple de librairie: librairie vecteur: Edition de liens et librairies 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 Une unique fois libv3.a $ ar -rv libv3.a v3.o 2. Utilisation de la librairie: v3.h #include $ gcc -c main.c -o main.o -g -Wall -Wextra $ gcc main.o -lv3 main.c main.o executable 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 code source librairie lib<nom>.so $ gcc -c main.c $ gcc main.o -L. -l<nom> -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: $./executable lib<nom>.so 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 Remarques: 1. Si la lib change => l'executable change de comportement Sans avoir à être recompilée!! Notion Essentielle!! IMPORTANT A Savoir (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 Une unique fois libv3.so 2. Compilation et link avec la lib v3.h #include $ gcc -c main.c -o main.o -g -Wall -Wextra $ gcc main.o -lv3 -L. main.c main.o executable 078

Edition de liens et librairies!! Notion Essentielle!! IMPORTANT A Savoir Exemple concret de librairies dynamiques: librairie vecteur: v3.h v3.c libv3.so programme utilisant la librairie: main.c Utilisation de la librairie: executable Par défaut: viens chercher la lib dans /usr/lib/ repertoires déjà enregistrés ajout du repertoire local (.) $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. $./executable repertoire courant 079

Edition de liens et librairies Exemple: version_1 version_2 complex.h complex.c complex.h complex.c complex.o libcomplex.so complex.o libcomplex.so $ gcc -c complex.c -g -Wall -Wextra -fpic -o complex.o $ gcc -c complex.c -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 Exemple: version_1 version_2 cp complex.h complex.c complex.h complex.c workspace complex.o libcomplex.so complex.o libcomplex.so mon_programme.c complex.h 081

Edition de liens et librairies Exemple: version_1 version_2 complex.h complex.h complex.c complex.c workspace cp complex.o libcomplex.so complex.o libcomplex.so complex.h libcomplex.so mon_programme.c mon_programme.o mon_executable $ gcc -c mon_programme.c -g -Wall -Wextra $ gcc mon_programme.o -L. -lcomplex -o mon_executable 082

Edition de liens et librairies Exemple: version_1 version_2 workspace complex.h complex.c complex.h complex.c complex.h mon_programme.c libcomplex.so mon_programme.o mon_executable complex.o complex.o libcomplex.so libcomplex.so $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. $./mon_executable 083

Edition de liens et librairies Exemple: version_1 version_2 workspace complex.h complex.c complex.h complex.c complex.h mon_programme.c libcomplex.so mon_programme.o mon_executable complex.o complex.o libcomplex.so libcomplex.so $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. cp (erase version_1) $./mon_executable (principe du patch logiciel) 084

Edition de liens et librairies Exemple: version_1 version_2 workspace complex.h complex.c complex.h complex.c mon_programme.c complex.o complex.o libcomplex.so libcomplex.so Si on ne veut pas copier/déplacer de fichiers:!! Notion Essentielle!! IMPORTANT A Savoir $ 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