Programmer en C/C++ sous GNU/LINUX

Documents pareils
Cours Langage C/C++ Programmation modulaire

Le prototype de la fonction main()

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)

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

Introduction au langage C

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

Programmation système en C/C++

Quelques éléments de compilation en C et makefiles

Programmation système I Les entrées/sorties

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

Cours Programmation Système

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

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

Programmation système de commandes en C

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

Conventions d écriture et outils de mise au point

Outils pour la pratique

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

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

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

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

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

Arguments d un programme

Algorithmique et Programmation, IMA

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

Chaîne de production d un programme

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

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

Chapitre 10 : Logiciels

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

Cours 6 : Tubes anonymes et nommés

Programmation impérative

Construction de logiciel et packaging

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

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

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

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

INF 104 (SELC) Introduction au langage C

Programmation Classique en langage C

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

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

Le langage C. Séance n 4

Simulation d un système de paiement par carte bancaire

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

OS Réseaux et Programmation Système - C5

Les chaînes de caractères

Notes de Cours - Programmation Pascal Ferraro

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

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

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

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

Optimisation de logiciels de modélisation sur centre de calcul

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


INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

I. Introduction aux fonctions : les fonctions standards

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Langage Éric Guérin 5 octobre 2010

Derrière toi Une machine virtuelle!

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

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

Le système de gestion des fichiers, les entrées/sorties.

Introduction à C++ et à wxwidgets

TP2 : tableaux dynamiques et listes chaînées

Les structures. Chapitre 3

Programmation en langage C

Programmation impérative

Java Licence Professionnelle CISII,

Introduction à l héritage en C++

INITIATION A LA PROGRAMMATION

Les techniques de protection du logiciel

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

COMPARAISONDESLANGAGESC, C++, JAVA ET

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

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

Chap III : Les tableaux

Une introduction à Java

Les failles Format String

Chapitre 1 : La gestion dynamique de la mémoire

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

Programme awk------introduction rapide

TP1. Outils Java Eléments de correction

Tutoriel code::blocks

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

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN

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

TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 2 e année Génie Informatique

as Architecture des Systèmes d Information

Exercice sur les Dockers

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

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

Cours Java Native Interface

Lier Erlang avec d autres langages de programmation

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Chapitre 5 : Les procédures stockées PL/SQL

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

Algorithmique, Structures de données et langage C

Les débordements de tampons et les vulnérabilités de chaîne de format 1

Apprendre Java et C++ avec NetBeans

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

Transcription:

Programmer en C/C++ sous GNU/LINUX 1

Compiler avec GCC Compiler avec GCC Les compilateurs disponibles sur les systèmes Linux font tous partie de la GNU Compiler Collection, plus communément appelée GCC (http://gcc.gnu.org/.). GCC inclut également des compilateurs C, C++, Java, Objective-C, Fortran etc. Supposons que vous ayez un programme reciprocal avec : un fichier source C++ (reciprocal.cpp) et ; un fichier source C (main.c) Un fichier d entête (reciprocal.hpp) Ce programme calcule l'inverse d'un entier. 2

Exemple Programmer sous GNU/LINUX Fichier source C main.c #include <stdio.h> #include <stdlib.h> #include "reciprocal.hpp" int main (int argc, char **argv) { int i; i = atoi (argv[1]); printf ("L'inverse de %d est %g\n", i, reciprocal (i)); return 0; } Fichier source C++ reciprocal.cpp #include <cassert> #include "reciprocal.hpp" double reciprocal (int i) { } Compiler avec GCC assert (i!= 0); // i doit être différent de zéro return 1.0/i; Fichier d'entête reciprocal.hpp #ifdef %% %%cplusplus extern "C" { #endif extern double reciprocal (int i); #ifdef %% %%cplusplus } #endif 3

Compiler avec GCC Compiler un Fichier Source Isolé L'option -c indique à gcc ou g++ de ne compiler le fichier que sous forme d'un fichier objet; sinon, gcc ou g++ tenterait de lier le programme afin de produire un exécutable. % gcc -c main.c main.o % g++ -c reciprocal.cpp Maintenant que vous avez compilé main.c et reciprocal.cpp, vous devez les lier. % g++ -o reciprocal main.o reciprocal.o Vous pouvez maintenant lancer reciprocal comme ceci: %./reciprocal 7 L'option -I est utilisée pour indiquer à GCC où rechercher les fichiers d'entête. % g++ -c -I../include reciprocal.cpp % g++ -c -D NDEBUG reciprocal.cpp Désactivez la vérification en définissant la macro NDEBUG. 4

Lier les Fichiers Objet Compiler avec GCC L option O optimise le code afin qu'il s'exécute aussi rapidement que possible % g++ -c -O2 reciprocal.cpp Ajout d une bibliothèque (-l) % g++ -o reciprocal main.o reciprocal.o -lpam inclure libpam.a lors de l'édition de liens Si vous voulez que l'éditeur de liens recherche en plus dans d'autres répertoires, vous devez utiliser l'option -L, % g++ -o reciprocal main.o reciprocal.o - L/usr/local/lib/pam -lpam indiquer à l'éditeur de liens de rechercher les bibliothèques dans le répertoire /usr/local/lib/pam % gcc -o app app.o -L. -ltest indiquer à l'éditeur de liens de rechercher la bibliothèque test dans le répertoire courant 5

GNU Make Automatiser le Processus avec GNU Make Objectifs : Compiler de gros programmes dont les sources sont réparties en plusieurs fichiers. Déterminer quelles sont les parties qui doivent être recompilées lorsque des modifications ont étés effectuées et appeler les commandes nécessaires à leur recompilation. La commandemakeinterprète pour cela un fichier, qu elle recherche dans le répertoire courant, appelémakefileetqui décrit les relations entre fichiers sources et contient les commandes nécessaires àla compilation. Les makefilessont, en grande partie, constitués d'une suite derègles. Une règle (rule en anglais) est constituée de : cibles(targets en anglais); prérequis ou dépendances(prerequisites ou dependencies en anglais); commandes(commands en anglais). Une cibleest généralement le nom de l'un des fichiers (ou d'un des ensembles de fichiers) que l'on souhaite construire avec le makefile. Les prérequisdésignent toujours les fichiers dont dépendent la cible ou les cibles. Plus précisément, un fichierprqdonnédoit être le prérequisd'une cibletargdonné, si on considère qu'il faut remettre àjourtargàchaque fois que le fichier Prq est modifié. Enfin les commandessont une liste de commandes qu'il faut exécuter pour reconstruire la cible. 6

GNU Make Automatiser le Processus avec GNU Make Exemple précédant : fichier Makefile reciprocal: main.o reciprocal.o g++ $(CFLAGS) -o reciprocal main.o reciprocal.o main.o: main.c reciprocal.hpp gcc $(CFLAGS) -c main.c reciprocal.o: reciprocal.cpp reciprocal.hpp g++ $(CFLAGS) -c reciprocal.cpp clean: rm -f *.o reciprocal % make Recompiler avec les optimisations activées, vous procéderiez de la façon suivante: % make clean rm -f *.o reciprocal % make CFLAGS=-O2 gcc -O2 -c main.c g++ -O2 -c reciprocal.cpp g++ -O2 -o reciprocal main.o reciprocal.o Notez que le drapeau -O2 a été inséré à la place de $(CFLAGS) dans les règles. 7

Le configurateur MAKE Le configurateur MAKE Lit une spécification de dépendances ou mode d'emploi de fabrication, et l'interprète pour créer une nouvelle version complète. Il vérifie les dates de dernière modification, pour réaliser le minimum de compilation. make examine si les dépendances de l'entrée sont à jour; sinon, fait exécuter par des processus UNIX les commandes de fabrication en les soumettant une par une à l'interpréteur shell. 8

Mode de fonctionnement: Makefile Syntaxe de Makefile : Lignes de commentairesdébutent par un # Définitions d'entrée nomment les entrées et définissent les dépendances: Cible : liste de dépendances Exemple: prog: def.c sp.o prog.c Règles de fabrication forment la recette; suivent une définition d'entrée: <tab><commande> Exemple: cc -o prog prog.o def.o sp.o Les entrées génériques.s [.t ]+ : Programmer sous GNU/LINUX.s.t. mode d'emploi général à appliquer pour fabriquer un fichier de suffixe.t quand on a un fichier de suffixe.s Les lignes d'inclusion include <fichier> Le configurateur MAKE Définitions de macros une macro est une variable de make <nom macro> = <texte définissant la macro> 9

L'appel de make make [-f makefile] [options] [macro=valeur ] [cible] -i Ignorer les erreurs retournées par les commandes exécutées; -s Ne pas imprimer les commandes avant de les exécuter; -r Programmer sous GNU/LINUX Le configurateur MAKE Ne pas utiliser les règles implicites; -t Maj des dates des fichiers cibles sans exécuter les commandes; -o Retourner un code précisant l'état cible -f fic fic est le nom du fichier description à utiliser (makefile). 10

Utilisation des macros Le configurateur MAKE La substitution de macro précédant son nom entre () par $. MISEAUPOINT = # rien: pas de mise au point prog: def.p sp.o prog.o pc -o prog prog.o def.o sp.o def.o: def.p pc -c $(MISEAUPOINT) def.p sp.o: sp.p def.o pc -c $(MISEAUPOINT) sp.p prog.o: prog.p def.o pc -c $(MISEAUPOINT) prog.p On obtient un module prog pour la mise au point de 2 façons: MISEAUPOINT = -g # dans le makefile $ make MISEAUPOINT = -g # dans l appel de make 11

Exercice Ecrireun programme main.cqui fait appel àdiverses fonctions déclarées dans un fichier liste.c(et liste.h par conséquent) et permettant de réaliser des fonctions arithmétiques usuelles. Selon les paramètres entrés par l utilisateur (nb1, nb2, opérateur), une des fonctions sera exécutées et son résultat affiché. Ecrireun fichier Makefilepermettant d automatiser la compilation de ce programme. 12

Solution #include <stdio.h> Liste.c int somme(int nb1, int nb2) { int som; som=nb1+nb2; return som; } int produit(int nb1, int nb2) { int prod; prod=nb1*nb2; return prod; } #include <stdio.h> #include <string.h> #include"liste.h" main.c void main(int argc, char* argv[]) { if (strcmp(argv[3],"+")==0) printf("%d\n",somme(atoi(argv[1]),atoi(argv[2]))); if (strcmp(argv[3],"*")==0) printf("%d\n",produit(atoi(argv[1]),atoi(argv[2]))); } #ifndef_liste_h #define_liste_h Liste.h void affiche(void); int somme(int nb1, int nb2); int produit(int nb1, int nb2); #endif 13

Déboguer avec le Débogueur GNU (GDB) GNU Debugger: Introduction Le débogueur est utilisé pour trouver pourquoi un programme ne se comporte pas comme prévu. Compiler avec les Informations de Débogage Pour compiler en activant les informations de débogage, utiliser l'option -g % make CFLAGS=-g gcc -g -c main.c g++ -g -c reciprocal.cpp g++ -g -o reciprocal main.o reciprocal.o 14

Déboguer avec le Débogueur GNU (GDB) Lancer GDB % gdb reciprocal (gdb) lancer votre programme au sein du débogueur. (gdb) run Starting program: reciprocal Program received signal SIGSEGV, Segmentation fault. %% %%strtol_internal (nptr=0x0, endptr=0x0, base=10, group=0) at strtol.c:287 287 strtol.c: No such file or directory. (gdb) Vous pouvez observer la pile en utilisant la commande where: (gdb) where #0 %% %%strtol_internal (nptr=0x0, endptr=0x0, base=10, group=0) at strtol.c:287 #1 0x40096fb6 in atoi (nptr=0x0) at../stdlib/stdlib.h:251 #2 0x804863e in main (argc=1, argv=0xbffff5e4) at main.c:8 main a appelé la fonction atoi avec un pointeur NULL ce qui est la source de l'erreur. 15

Déboguer avec le Débogueur GNU (GDB) Les commandes de GDB remonter de deux niveaux dans la pile jusqu'à atteindre main (gdb) up 2 #2 0x804863e in main (argc=1, argv=0xbffff5e4) at main.c:8 8 i = atoi (argv[1]); GDB retrouver le fichier source main.c et il affiche la ligne contenant l'appel Vous pouvez inspecter la valeurs des variables en utilisant la commande print: (gdb) print argv[1] $2 = 0x0 Cela confirme que le problème vient d'un pointeur NULL passé à atoi. Vous pouvez placer un point d'arrêt en utilisant la commande break: (gdb) break main Breakpoint 1 at 0x804862e: file main.c, line 8. relancer le programme avec un argument, comme ceci: (gdb) run 7 Starting program: reciprocal 7 Breakpoint 1, main (argc=2, argv=0xbffff5e4) at main.c:8 8 i = atoi (argv[1]) Vous remarquez que le débogueur s'est arrêté au niveau du point d'arrêt. 16

Déboguer avec le Débogueur GNU (GDB) Les commandes de GDB Vous pouvez passer à l'instruction se trouvant après l'appel à atoi en utilisant la commande next: (gdb) next 9 printf ("L'inverse de %d est %g\n", i, reciprocal (i)); Si vous voulez voir ce qui se passe à l'intérieur de la fonction reciprocal, utilisez la commande step, (gdb) step reciprocal (i=7) at reciprocal.cpp:6 6 assert (i!= 0); Vous êtes maintenant au sein de la fonction reciprocal. 17