0.1 Création d une bibliothèque



Documents pareils
Introduction au langage C

Quelques éléments de compilation en C et makefiles

Bases de programmation. Cours 5. Structurer les données

Algorithmique et Programmation, IMA

Le langage C. Séance n 4

Les structures. Chapitre 3

Programmation système I Les entrées/sorties

Cours Langage C/C++ Programmation modulaire

Programmation système en C/C++

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

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Outils pour la pratique

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

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

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

Premiers Pas en Programmation Objet : les Classes et les Objets

Cours Programmation Système

Le prototype de la fonction main()

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Les fichiers. Chapitre 4

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

Utilisation d objets : String et ArrayList

TP1. Outils Java Eléments de correction

Programmation système de commandes en C

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

Conventions d écriture et outils de mise au point

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

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

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

Les chaînes de caractères

Chap III : Les tableaux

Systeme d'exploitation

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

Rappels Entrées -Sorties

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

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

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

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

Initiation. àl algorithmique et à la programmation. en C

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Langage Éric Guérin 5 octobre 2010

Programmation en langage C

Travaux Dirigés n 1 : chaînes de caractères

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

Java Licence Professionnelle CISII,

Programmation impérative

I. Introduction aux fonctions : les fonctions standards

TP, première séquence d exercices.

Projet De Stijl Plate-forme pour robots mobiles


Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Introduction à Eclipse

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Ak Documentation

TP 1. Prise en main du langage Python

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

Chapitre 1 : La gestion dynamique de la mémoire

Utilisation du client de messagerie Thunderbird

La programmation des PIC en C. Les fonctions, les interruptions.

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Les processus légers : threads. Système L3, /31

Tp 1 correction. Structures de données (IF2)

SUPPORT DE COURS. Langage C

Présentation du langage et premières fonctions

PIC EVAL Dev Board PIC18F97J60

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Cours d initiation à la programmation en C++ Johann Cuenin

AWS avancé. Surveiller votre utilisation d EC2

Introduction à l héritage en C++

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

Chapitre 10 : Logiciels

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

Programmation en langage C d un µcontrôleur PIC à l aide du compilateur C-CCS Sommaire

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Dossier projet isn 2015 par Victor Gregoire

Programmation en langage C Eléments de syntaxe

Programmation Classique en langage C

Introduction à la Programmation Parallèle: MPI

Programmer en JAVA. par Tama

30.avr.10 Présentation miniprojet. 9.mars.10 Cours 3 4.mai.10 Cours C mars.10 Cours 4 11.mai.10 Cours C++ 2

Apprendre Java en 154 minutes

Introduction à Linux (pour le HPC) «Linux 101» Présentation :

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

OS Réseaux et Programmation Système - C5

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

Comment utiliser FileMaker Pro avec Microsoft Office

Les structures de données. Rajae El Ouazzani

Algorithmique, Structures de données et langage C

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

INITIATION A LA PROGRAMMATION

Java Licence professionnelle CISII,

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

SCL LOGICIEL DE CONTROL

Eclipse atelier Java

Introduction à MATLAB R

Programmation en Java IUT GEII (MC-II1) 1

Ateliers L A TEX L A TEX portable ou

Transcription:

0.1 Création d une bibliothèque 1 0.1 Création d une bibliothèque Je vais ici simplement me contenter de reprendre l exemple de l introduction et réécrire le programme cette fois en utilisant une bibliothèque statique ou dynamique. Ce qui sera écrit restera vrai pour tout programme. 0.1.1 1. Création des fichiers composant la librairie : Le premier fichier à créer est celui de la déclaration des fonctions et sera identique à ceci : /*Dans ce fichier on ne fait que déclarer nos fonctions (sauf la fonction principale main évidemment) */ /*Ces trois lignes en rouges permettent à ce que le fichier.h ne soit utilisé qu une fois (ce qui est suffisant) */ #ifndef _ENTETE_ #define _ENTETE_ int arr(double); void releve (char a[128], double *z, double *e,int *r); int entree (void); void calcul(double *a, double z, double e, double *r, int *t ); void sortie (double a, int b, int flag) ; #endif Nous enregistrons ce fichier sous le nom par exemple entete.h. Ce qui est important ici est l extension.h. Explication sur #ifndefine _ENTETE_ : si la variable _ENTETE_ n existe pas alors elle sera créée à l aide de #define _ENTETE_, puis on continuera à exécuter la suite c est à dire la déclaration des fonctions jusque #endif. Au contraire si la variable existe déjà (au delà d une compilation) alors l exécution s arrêtera puisque qu il n y a aucune commande après #endif. Cela permet simplement de ne pas compiler plusieurs fois le même fichier s il a été inclus plusieurs fois. Nous allons maintenant créer le fichier où les fonctions seront écrites. Il ressemblera simplement à cela : /*Dans ce fichier nous écrivons nos fonctions (sauf main :-)) */ /*Il faut inclure le fichier entete.h avec : */ #include "entete.h" /*Cette constante n est pas très jolie dans une librairie mais pas le courage de tout réécrire :-) : */ #define zero -273.15 int arr(double a) { return ( (int) a + 0.5 );

2 int entree (void) {int resu; char r[20]; scanf("%s",r); if (*r== o ) return(1); else if (*r== n ) return(0); else {printf ("Vous avez saisi un mauvais caractère.\nrecommencez s il vous plait.\n"); return (entree ()); ] void releve (char l[128], double *a1, double *a2,int *b) {char repoui= o,repnon= n,rep; int a, flag = 1 ; printf ("Saisie des relevés de températures. Voulez-vous continuez?\n"); printf ("%c/%c\n",repoui,repnon); *b = entree(); while (*b==1 && flag == 1){printf ("Donnez un relevé de température\nlieu :\n"); scanf ("%s",l); printf ("Donnez la température maximale :\n"); scanf ("%lf",a1); printf ("Donez la température minimale :\n"); scanf ("%lf",a2); if (*a1 < *a2 ) printf ("Vous donnez une température maximale inférieure à la température minimale.\nchercheriez-vous l écran bleu?\n"); else flag = 0; if (*a1 < zero *a2 < zero) printf ("Changez de thermomètre : vous êtes en-dessous du zéro absolu!\n"); else flag = 0; void calcul(double *Max,double tempmax, double tempmin, double *ecart, int *N) {if ( *Max < tempmax ){ *Max = tempmax ; *N = 1; 19 octobre 2015 GNU/Linux pour tous

0.1 Création d une bibliothèque 3 else if ( *Max == tempmax) {++*N; else if ( *Max > tempmax) {/*Rien à faire*/ if ( *ecart < (tempmax - tempmin) ) *ecart= tempmax - tempmin; void sortie (double a, int b, int flag) {if ( flag == 1 ){printf("ecart de températures maximal :\n%f\n",a); printf("arrondi de l écart maximal de températures\n%d\n",arr(a)); printf("nombre de lieu ayant observé la température maximale :\n%d\n",b); else printf ("Pas de relevé.\n"); Cette fois nous enregistrons ce programme avec le nom corps.c. Comme précédemment ce qui est avant tout important est l extension.c que porte le nom de ce fichier. La l utilisation des guillemets dans #include "entete.h" signifie que nous donnons le chemin relatif entre le fichier incluant et le fichier inclus. Nous pourrions placer le fichier dans le répertoire où le compilateur s attendra à le trouver (par exemple /usr/include) et en ce cas nous donnerons le chemin relatif à ce répertoire en utilisant la syntaxe : #include <entete.h>. Maintenant il ne nous reste plus qu à écrire le programme proprement dit : #include <stdio.h> #include "entete.h" #define zero -273.15 int main(void) {double TMax = zero, ecartmax = -1, tempmax, tempmin; int nblieumax = 0, drap = 1, k = 0; char lieu[128]; printf ("Ce programme calcul l écart entre la température maximale et la température minimale pour une ville donnée et renvoie l écart maximal observé sur l ensemble des villes observées.\ Il renvoie aussi le nombre de lieu ayant observée la température maximale.\n Les températures doivent être données en C.\n"); while (drap == 1){ ++k; releve (lieu,&tempmax,&tempmin,&drap); if ( drap == 1) calcul(&tmax,tempmax,tempmin,&ecartmax,&nblieumax); if (k!= 1){drap = 1 ; sortie(ecartmax,nblieumax,drap);

4 else {drap = 0 ; sortie(ecartmax,nblieumax,drap); que nous pouvons appeler temperature.c par exemple. Pour ce qui est de la rédaction des fichiers nous avons terminé. Il ne reste plus qu à compiler, et comme dit initialement : c est la compilation qui fait que nous aurons une librairie statique ou bien une librairie dynamique. 0.1.2 2. Compilation pour une librairie statique : Allons droit dans le vif du sujet : ouvrez un terminal et placez-vous dans le répertoire courant où sont rangés vos trois fichiers. Maintenant il ne vous reste plus qu à saisir cela : gcc -c temperature.c gcc -c corps.c ar -q corps.a corps.o gcc -o temperature temperature.c corps.a./temperature Allons y pour les explications! La commande gcc -c permet de compiler sans créer de lien ; autrement dit lorsque nous compilons temperature.c, nous ne touchons pas à corps.c bien que celui-ci soit inclus (#include). La ligne de commande gcc -c temperature.c va générer un fichier temperature.o, de même nous allons créer un fichier corps.o avec la seconde ligne de commande. ar permet de créer, modifier ou extraire des archives. Ainsi la commande ar -q corps.a corps.o permet de créer l archive corps.a (option -q : concaténation rapide). Et évidemment cette archive n est en réalité rien d autre que notre librairie... Petite précision : si je voulais ajouter un fichier corps2.o à ma librairie, il me faudrait utiliser la syntaxe suivante de ar : ar -qa corps.o corps.a corps2.o Comme vous l avez compris il faut spécifier lors d ajout à ar après quel fichier dans l archive il doit écrire. Et enfin la derniére ligne gcc -o temperature temperature.c corps.a permet de réaliser les liens (entre le programme et la bibliothéque statique). En réalité, c est le programme ld qui crée les liens mais gcc y fait appel. Dans ce cas, la librairie est incluse dans le programme lors de la compilation d où le nom de librairie statique. A noter que l option -o de gcc permet seulement de spécifier le nom du programme, ici temperature. Une petite remarque au passage : nous avons utilisé le nom de corps.a pour l archive. Cela n est pas une obligation mais par convention le.a est utilisé pour désigner les librairies statiques. 0.1.3 3. Compilation pour une librairie dynamique : Ici il va y avoir quelques petits changements, je vous laisse les découvrir : gcc -c temperature.c gcc -c corps.c 19 octobre 2015 GNU/Linux pour tous

0.1 Création d une bibliothèque 5 gcc -o corps.so -shared corps.o gcc -o temperature temperature.o corps.so export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH./temperature Les deux premiéres lignes sont identique au cas de la librairies statiques donc sans commentaire. L option -shared de la troisiéme ligne permet de produire un objet partagé qui peut être lié avec d autres objets pour former un exécutable, comme indiqué dans le man. Autrement dit, c est par cette ligne que nous créons notre bibliothéque dynamique. La ligne gcc -o temperature temperature.o corps.so permet de créer l exécutable en lui disant de faire appel à notre librairie dynamique corps.so. Celle-ci sera incluse à l exécutable qu au moment de l exécution. export LD_LIBRARY_PATH=. :$LD_LIBRARY_PATH : et oui car autrement lors de l exécution, le programme ne trouvera pas la bibliothéque :-). En fait les librairies dynamiques sont rangées dans des répertoires spécifiques. Lors de l exécution d un programme faisant appel à une librairie dynamique, ce sont ces répertoires qui sont regardés. Cette ligne permet de rajouter le répertoire courant où se trouve notre librairie dynamique au PATH des librairies dynamiques. En tapant : more /etc/ld.so.conf vous pourrez connaître les répertoires où sont rangées vos librairies dynamiques de votre systéme. Ainsi une autre solution serait de rajouter votre librairie dans l un de ces répertoires avec pour commande : cp corps.so /un_répertoire_de_/etc/ld.so.conf. Et finalement nous pouvons exécuter le programme. Une nouvelle fois.so n est pas obligatoire mais est la convention pour désigner les librairies dynamiques. Une page de Léa qui m a aidé et que je vous recommande : ICI 1. ««Précédent 2 Suivant»» 3 1. http://www.lea-linux.org/documentations/index.php/dev-libc 2. http://www.trustonme.net/didactels/153.html 3. http://www.trustonme.net/didactels/155.html