MEUTER Cédric / LEVY Eythan. Université Libre de Bruxelles 23/09/2005



Documents pareils
Quelques éléments de compilation en C et makefiles

Introduction au langage C

Le prototype de la fonction main()

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

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

Conventions d écriture et outils de mise au point

Cours Langage C/C++ Programmation modulaire

Programmation système de commandes en C

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

Programmation système I Les entrées/sorties

Algorithmique et Programmation, IMA

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

INFO-F-404 : Techniques avancées de systèmes d exploitation

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

Mon premier rpm. 7 juin Avant de commencer RPM URPMI RPMBUILD... 2

Notes de Cours - Programmation Pascal Ferraro

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)

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

Outils pour la pratique

Cours Programmation Système

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

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

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

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

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

TP1. Outils Java Eléments de correction

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

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

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

UE C avancé cours 1: introduction et révisions

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

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

Environnements et Outils de Développement Cours 1 Introduction

Systeme d'exploitation

Programmation système en C/C++

Introduction à l héritage en C++

Programmation en C/C++

Programmation C. J.-F. Lalande. 15 novembre 2012

Gestion Electronique de Document (ECM/GED)

Chaîne de production d un programme

Débogage de code* Mardi 13 décembre Romaric DAVID Université de Strasbourg - Direction Informatique Pôle HPC. hpc.unistra.

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

Introduction...3. Objectif...3. Manipulations...3. Gestion des utilisateurs et des groupes...4. Introduction...4. Les fichiers de base...

Le langage C. Séance n 4

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

Arguments d un programme

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

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

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

Langage Éric Guérin 5 octobre 2010

Les structures. Chapitre 3

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

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

Derrière toi Une machine virtuelle!

Utiliser Dev-C++ .1Installation de Dev-C++ Table des matières

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

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

Pensez à vous inscrire... si ce n est pas encore fait

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

Tutoriel code::blocks

Exercice sur les Dockers

Cours 6 : Tubes anonymes et nommés

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

Programmation C. Apprendre à développer des programmes simples dans le langage C

OS Réseaux et Programmation Système - C5

Construction de logiciel et packaging

INF 104 (SELC) Introduction au langage C

Programmation en langage C Eléments de syntaxe

Introduction à la Programmation Parallèle: MPI

Langages et Concepts de Programmation Introduction à la programmation en langage C

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

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Fiche d utilisation du logiciel. 1 - Installation. J. Thioulouse & D. Chessel

Programmation avancée et répartie en Java : interfaçage avec d autres langages

Cours de programmation avancée. Le langage C. Université du Luxembourg

Programmation en langage C

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

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

Eclipse atelier Java

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Plan du cours. Historique du langage Nouveautés de Java 7

Cours de Programmation 2

Programmation en C. École Nationale Supérieure de Techniques Avancées. Pierre-Alain Fouque et David Pointcheval

Le traitement du temps

Cours 1 : La compilation

SERVEUR DÉDIÉ DOCUMENTATION

Quick Start Guide This guide is intended to get you started with Rational ClearCase or Rational ClearCase MultiSite.

TP1 : Initiation à Java et Eclipse

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

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

Programmation stochastique

Programmation impérative

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

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

Architecture des ordinateurs

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

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

Initiation à JAVA et à la programmation objet.

Remote Method Invocation Les classes implémentant Serializable

Transcription:

Développement en C sous LINUX MEUTER Cédric / LEVY Eythan Université Libre de Bruxelles 23/09/2005 Développement en C sous LINUX p. 1

Comment écrire son programme? Principaux éditeurs : XEmacs Emacs vi Il en existe d autres : gedit, nedit, kwrite, kate,... Choisissez celui qui vous convient le mieux! Développement en C sous LINUX p. 2

Comment compiler son programme? GCC = GNU C Compiler Compilateur C/C++ pour linux Interface en ligne de commande Exemple de compilation : /* helloworld.c */ int main(int argc, char **argv) { printf("hello world!\n"); return 0; } [cmeuter@litpc34 Archi]$ gcc helloworld.c [cmeuter@litpc34 Archi]$./a.out hello world! Développement en C sous LINUX p. 3

Quelques options bien utiles -o filename : permet de changer le nom du fichier d output. [cmeuter@litpc34 Archi]$ gcc helloworld.c -o hello [cmeuter@litpc34 Archi]$./hello hello world! -Wall : le compilateur effectue plus de vérification à la compilation et génère des warnings en cas de problème. [cmeuter@litpc34 Archi]$ gcc helloworld.c -Wall -o hello helloworld.c: In function main : helloworld.c:4: warning: implicit declaration of function printf [cmeuter@litpc34 Archi]$./hello hello world! Développement en C sous LINUX p. 4

Directive de compilation (I) #include <filename> : directive de compilation qui permet d inclure le contenu d un fichier. GCC va chercher le fichier filename dans les répertoires de librairie standard /* helloworld.c */ #include <stdio.h> /* stdio.h contient la déclaration de printf */ int main(int argc, char **argv) { printf("hello world!\n"); return 0; } [cmeuter@litpc34 Archi]$ gcc helloworld.c -Wall -o hello [cmeuter@litpc34 Archi]$./hello hello world! Développement en C sous LINUX p. 5

Directive de compilation (II) #include filename : directive qui permet d inclure le contenu d un fichier. GCC va chercher le fichier filename dans le répertoire courant /* helloworld.h */ const char *hw = hello world! ; /* helloworld.c */ #include <stdio.h> /* stdio.h contient la déclaration de printf */ #include helloworld.h int main(int argc, char **argv) { printf("%s\n", hw); return 0; } [cmeuter@litpc34 Archi]$ gcc helloworld.c -Wall -o hello [cmeuter@litpc34 Archi]$./hello hello world! Développement en C sous LINUX p. 6

Découpe modulaire Un module est un ensemble de fonctions, types, variables qui se concentre sur une partie du programme (ex : gestion d un stack, d un arbre,...). Un module se compose généralement de deux fichiers : un fichier.h et un fichier.c Le fichier.h contient l interface du module (ce qui sera visible de l extérieur du module) : Les prototypes des fonctions Les types, variables et constantes globales Le fichier.c contient l implémentation du module (cette implémentation n est pas visible de l extérieur) : L implémentation des fonctions Les types, variables et constantes locales au module Développement en C sous LINUX p. 7

Le module helloworld /* helloworld.h */ const char *hw = "hello world!"; void print_hello_world(); /* helloworld.c */ #include "helloworld.h" #include <stdio.h> void print_hello_world() { printf("%s\n", hw); } /* main.c */ #include "helloworld.h" int main(int argc, char **argv) { print_hello_world(); return 0; } Développement en C sous LINUX p. 8

Problème d inclusion multiple Supposons que dans un fichier source.c, se trouve inclus deux fichiers : fichier1.h et fichier2.h, et que par ailleurs, ces fichiers aient besoin de faire appel à notre module helloworld, définit dans helloworld.h. Ce fichier sera inclus deux fois dans source.c (une fois via fichier1.h et une fois via fichier2.h). Cela peut causer des problèmes à la compilation. Développement en C sous LINUX p. 9

D autres directives à la rescousse! Il faut donc protéger les fichiers.h contre les inclusions multiples. Ceci est réalisé en utilisant les directives de compilation #define et #ifndef... #endif. #define permet de définir un symbole qui sera remplacé à la compilation #define PI 3.141592654 #ifndef... #endif permet d inclure du code selon qu un symbole a été défini précédemment ou pas #ifndef SYMBOLE /* Code à include si SYMBOLE n est pas défini */ #endif Développement en C sous LINUX p. 10

Protection contre l inclusion multiple Lors de la première inclusion on définit un symbole unique pour le fichier.h. A chaque inclusion, on teste l existence du symbole. Le module helloworld revisité : /* helloworld.h */ #ifndef HELLOWORLD_H #define HELLOWORLD_H const char *hw = "hello world!"; void print_hello_world(); #endif Développement en C sous LINUX p. 11

Compilation séparée (I) Pour compiler un programme composé de plusieurs modules, on peut passer tout les fichiers.c en options à gcc [cmeuter@litpc34 Archi]$ gcc -Wall helloworld.c main.c -o hello [cmeuter@litpc34 Archi]$./hello hello world! En utilisant cette méthode, si on modifie un module, on doit tout recompiler! Heureusement, gcc offre une alternative : la compilation séprarée avec l option -c Chaque fichier.c est compilé en un fichier.o [cmeuter@litpc34 Archi]$ gcc -Wall -c helloworld.c [cmeuter@litpc34 Archi]$ gcc -Wall -c main.c Développement en C sous LINUX p. 12

Compilation séparée (II) Pour créer l exécutable, il ne reste plus qu à faire l édition des liens (linkage) [cmeuter@litpc34 Archi]$ gcc helloworld.o main.o -o hello [cmeuter@litpc34 Archi]$./hello hello world! De cette manière, lorsqu un module est modifié, il suffit de recompiler le module modifié uniquement, et ensuite d effectuer l édition des liens Développement en C sous LINUX p. 13

Comment automatiser la compilation? Le problème de la compilation séparée, c est qu il faut recompiler à la main chaque fichier modifié : ça peut vite devenir long et fastidieux! On peut automatiser le processus en utilisant l outil make Pour cela, il faut décrire dans un fichier appellé Makefile ou makefile, les règles de compilation. Chaque règle est de la forme : <fichier voulu> : <fichiers dont il dépend> <command pour créer le fichier> Développement en C sous LINUX p. 14

Un exemple de Makefile Reprenons l example du module helloworld # Makefile pour le module helloworld # (le charactère # dénotes un commentaire) hello: main.o helloworld.o gcc main.o helloworld.o -o hello helloworld.o: helloworld.c helloworld.h gcc -Wall -c helloworld.c main.o: main.c helloworld.h gcc -Wall -c main.c Développement en C sous LINUX p. 15

La gestion d erreur en C (I) Les appels systèmes, ainsi que les fonctions des librairies standards C sont succeptibles de ne pas fonctionner comme attendu : ouverture (fopen() ou open()) d un fichier alors que l utilisateur n en a pas les permissions allocation (malloc) de mémoire alors qu il n y a plus assez de mémoire disponible... Le C offre toute une série de fonctions/variables permettant une gestion d erreur propre : errno strerror perror assert Développement en C sous LINUX p. 16

La gestion d erreur en C (II) #include <errno.h> extern int errno; La variable entière errno est mise à jour par les appels systèmes et par certaines fonctions des librairies standard C. En cas d erreur, elle contient un code d erreur détaillant ce qui s est mal passé #include <string.h> char *strerror(int errnum); La fonction strerror() permet d obtenir à partir d un code d erreur (venant de errno) un message plus compréhensible Développement en C sous LINUX p. 17

La gestion d erreur en C (III) #include <stdio.h> void perror(const char *msg); La fonction perror permet d afficher un message d erreur sur le standard error (= msg) suivit du détail de la dernière erreur rencontrée durant un appel système ou un appel à une fonction des librairies standards. #include <assert.h> void assert(int expression); La macro assert() termine l exécution du programme si expression est évalué à faux (0). Ces gardes peuvent être désactivée en définisant le symbol NDEBUG avant d inclure assert.h (en utilisant #define) Développement en C sous LINUX p. 18

Le tracing Le tracing consiste à ajouter des printf dans le code pour afficher des messages de débogage (valeur d une variable, résultat de fonction,...). Cela permet de savoir pendant l exécution ou l on se trouve dans le code. int main(int argc, char **argv) { int x, y; /* du code jouant avec x et y */ } if (x < y) { printf( main: (x < y)\n ); fflush(stdout); } else { printf( main: (y >= x)\n ); fflush(stdout); } return 0; Développement en C sous LINUX p. 19

Le tracing conditionnel Malheureusement, les printf peuvent vite devenir nombreux et gènant, surtout lorsqu on a fini de déboguer le programme On peut résoudre ce problème en utilisant les directives de compilation #ifdef... #endif et #define #ifdef DEBUG printf( Mon message de debug!\n ); fflush(stdout); #endif Pour activer les message de debugage, il suffit de définir la constante voulue ( DEBUG dans l exempl) à l aide de la directive #define On peut également utiliser un symbole de debug différent pour chaque module. Développement en C sous LINUX p. 20

Débogueur symbolique Un autre facon de déboguer un programme est d utiliser un débogueur symbolique. Ce type de débogueur permet : d exécuter un programme pas à pas d afficher les valeurs intermédiaires des variables de placer des breakpoint d examiner le stack des appels de fonction... D une manière plus générale, il permet de comprendre et surtout localiser l erreur (segmentation fault)! Développement en C sous LINUX p. 21

GDB (I) GDB = GNU Debugger Debogueur symbolique pour linux Inerface interactive, en mode texte Avant de l utiliser, il est nécessaire de compiler le programme avec l option -g, afin de rajouter des informations symboliques dans l exécutable (noms des fonctions, variables,...) [cmeuter@litpc34 Archi]$ gcc -Wall -g bug.c -o bug Développement en C sous LINUX p. 22

GDB (II) Ensuite on peut lancer GDB en passant l exécutable en paramètre : [cmeuter@litpc34 error]$ gdb bug GNU gdb 6.0-2mdk (Mandrake Linux) Copyright 2003 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i586-mandrake-linux-gnu"... Using host libthread_db library "/lib/tls/libthread_db.so.1". (gdb) Développement en C sous LINUX p. 23

GDB (III) Les commandes les plus utilisée de GDB : l : affiche la ligne de code courante, ainsi que les 5 lignes suivantes et précédentes. l num : affiche la ligne de code num. b num : place un break point à la ligne de code num. n : execute l instruction suivante sans entrer dans les appels de fonctions. s : execute l instruction suivante et entre dans les appels de fonctions. p expression : affiche le résultat de l évaluation de expression. r args : execute le programme chargé avec les arguments args bt : affiche le stack d appel de fonction. Développement en C sous LINUX p. 24

Interface à GDB Il existe des interfaces graphiques à GDB. On peut citer DDD = Data Display Debugger Développement en C sous LINUX p. 25

Quelques références Advanced programming in the UNIX environment, par Richard Stevens, Addison-Wesley, ISBN 0-201-56317-7. Programmation Système en C sous Linux, par Christophe Blaess, Eyrolles, ISBN 2-212- 11054-5 Programmation Linux, par Neil Matthew et Richard Stones, Eyrolles, ISBN 1-861002-97-1 Linux : Le guide du développeur par John Goerzen, Eyrolles, ISBN 2-7464-0217-3 Développement en C sous LINUX p. 26

A vous de jouer! 1. Ecrire un module (fichiers.h et.c) de gestion d une liste dynamique d entiers, simplement liée, comprenant : (a) une fonction d initialisation (b) une fonction d insertion en début de liste (c) une fonction d insertion en fin de liste (d) une fonction pour effacer une liste 2. Ecrire une programme de démo qui utilise les fonctionalités du modules 3. Ecrire un Makefile qui permet de compiler le module et le programme démo en utilisant la compilation séparée Développement en C sous LINUX p. 27