Programmation C++/Compilation

Un livre de Wikilivres.

Définition de la compilation[modifier | modifier le wikicode]

La compilation consiste en une série d'étapes de transformation du code source en du code machine exécutable sur un processeur cible.

Le langage C++ fait partie des langages compilés : le fichier exécutable est produit à partir de fichiers sources par un compilateur.

Contrairement aux langages interprétés où il faut un logiciel interprétant le source, le fichier exécutable est produit pour une machine donnée : il est directement exécuté par le processeur. L'exécution est donc plus rapide.

Phases de la compilation[modifier | modifier le wikicode]

La compilation passe par différentes phases, produisant ou non des fichiers intermédiaires :

  • préprocessing : Le code source original est transformé en code source brut. Les commentaires sont enlevés et les directives de compilation commençant par # sont d'abord traités pour obtenir le code source brut ;
  • compilation en fichier objet : les fichiers de code source brut sont transformés en un fichier dit objet, c'est-à-dire un fichier contenant du code machine ainsi que toutes les informations nécessaires pour l'étape suivante (édition des liens). Généralement, ces fichiers portent l'extension .obj ou .o ;
  • édition de liens : dans cette phase, l'éditeur de liens (linker) s'occupe d'assembler les fichiers objet en une entité exécutable et doit pour ce faire résoudre toutes les adresses non encore résolues, tant des mémoires adressées que des appels de fonction. L'entité exécutable est généralement soit un exécutable, soit une bibliothèque dynamique (DLLs sous Windows et toutes les variantes, tels que objet COM, OCX, etc, et les .so sous Linux).

Les compilateurs sont capables de générer des bibliothèques statiques, qui sont en quelques sortes le rassemblement d'un ensemble de fichiers objet au sein d'un même fichier. Dans ce cas, la phase d'édition de liens n'a pas eu lieu.

Cette découpe en phases permet de compiler séparément les bibliothèques en fichiers objets, et l'application et évite donc de tout re-compiler, ce qui prendrait beaucoup de temps pour les applications ayant un code source important.

Les fichiers sources[modifier | modifier le wikicode]

Les fichiers sources d'un programme C++ portent souvent l'extension .cpp, .cxx, .cc, parfois .C et sont des fichiers textes lisibles par le programmeur.

Les fichiers d'en-tête[modifier | modifier le wikicode]

Les fichiers "entêtes" ("headers" en anglais), traditionnellement d'extension .h ou .hpp (mais la plupart des entêtes systèmes du C++ standard n'ont plus d'extension du tout), contiennent généralement les prototypes de différentes fonctions, structures et classes. Ces prototypes proviennent :

  • des bibliothèques standards du C++ : tout compilateur C++ doit fournir ces fichiers ainsi que les fichiers objets contenant l'implémentation des bibliothèques standards (souvent liées par défaut) ;
  • de bibliothèques non standards fournis par l'éditeur du compilateur ou de l'environnement de développement ;
  • de bibliothèques non standards (gratuites ou payantes) que le programmeur s'est procuré : citons par exemple la bibliothèque permettant d'accéder à une base de données mySQL. Lorsqu'une bibliothèque non standard est utilisée et que celle-ci englobe de nombreuses fonctionnalités (interface graphiques, accès à une base de données, surcouche système, communications réseaux, etc.), on parle parfois de framework. Citons par exemple Qt et WxWidgets dans cette catégorie. Un framework apparait parfois comme une véritable surcouche du système d'exploitation.

Les fichiers .cpp[modifier | modifier le wikicode]

Les fichiers .cpp (parfois .c ou .cc) contiennent la définition (l'implémentation) des différentes fonctions et méthodes définies dans les fichiers d'en-tête. La compilation des fichiers .cpp produit dans un premier temps des fichiers objets (extension .obj ou .o en général).

À noter que ces fichiers .cpp utilisent les fichiers d'en-tête. Ils les appellent en utilisant la syntaxe #include "nomdefichier" (nomdefichier comprenant l'extension, donc, souvent ".h"). Comme indiqué ci-dessus, ces fichiers d'en-tête seront donc inclus complètement par le préprocesseur à l'intérieur du code source brut.

L'édition de liens (linking)[modifier | modifier le wikicode]

L'édition de liens est la phase finale de la compilation qui va rassembler tous les fichiers objets afin de former un fichier exécutable. Les fichiers objets proviennent :

  • de la compilation de fichiers .cpp ;
  • de la bibliothèque standard (ceux-ci sont souvent liés automatiquement) ;
  • de bibliothèques ou framework extérieurs. Il faut dans ce cas explicitement dire à l'éditeur de liens quels sont les fichiers qu'il doit lier.

Les projets[modifier | modifier le wikicode]

Les makefiles[modifier | modifier le wikicode]

Afin de rendre possible le développement d'applications, les fichiers sources sont organisés sous forme de projet. Le C++ ayant été conçu sur les bases du C, il s'est ensuivi une gestion assez équivalente des projets. Avant l'avènement des environnements intégrés tels qu'on les connaît aujourd'hui, bon nombre de projets étaient construits sous forme de "makefile"s pris en charge par un outil spécifique make. De nos jours, cette technique est encore fortement utilisée dans les environnements UNIX et Linux. Il existe des alternatives plus modernes à make tels que CMake, automake, SCons, Boost.Build (bjam)…

Les environnements de développement intégrés[modifier | modifier le wikicode]

Les environnements de développement intégrés (EDI en français et IDE en anglais) sont des outils complets permettant de développer dans un certain langage de programmation. Ils contiennent en général :

  • un compilateur ;
  • un éditeur avec mise en évidence de la syntaxe (syntax highlighting) ;
  • des outils facilitant la gestion d'un projet :
    • outil pour ajouter/supprimer/déplacer des sources,
    • outil pour paramétrer la compilation et l'édition de liens,
    • outil pour créer des modes de compilation (typiquement debug/release) et tous les paramètres y afférent ;
  • des bibliothèques non standard censées aider le programmeur. Parfois, il s'agit d'un véritable framework ;
  • des outils pour permettre le lancement de l'application ;
  • des outils pour déboguer l'application ;
  • des outils pour créer des interfaces graphiques ;

Quelques exemples[modifier | modifier le wikicode]

Multi-plateformes[modifier | modifier le wikicode]

  • Eclipse, gratuit et Open Source, avec le plugin CDT, permet le développement en C/C++
  • Code::Blocks, gratuit et Open Source (EDI complet fournit avec gcc mais utilisable avec d'autres compilateurs).
  • CodeLite, gratuit et Open Source de base, seule exception : les plugins développés en annexe pour cet EDI peuvent être de n'importe quelle licence, y compris propriétaire et fermée.
  • Qt Creator, gratuit et Open Source, dédié au framework Qt (mais n'impose pas son usage).

Sous windows[modifier | modifier le wikicode]

Sous Linux[modifier | modifier le wikicode]

  • Anjuta
  • Kdevelop
  • g++ (Commun à tout système Unix, ligne de commande)
  • clang (Plus rapide que GCC mais toutefois compatible, ligne de commande)

Sous MacOS X[modifier | modifier le wikicode]

  • Apple Xcode (livré avec Mac OS X, utilise le compilateur clang).
  • Metrowerks CodeWarrior.
  • g++ (commun à tout système Unix, ligne de commande)