Compilation & Directives de Préprocesseur
Mécanismes de compilation
Précompilation : consiste à traiter, à parser les fichiers sources avant compilation (résolution des directives de préprocesseur i.e. remplacement de macros, suppression de texte, inclusion de fichiers…)
g++ -E fichier_source.cc
Mécanismes de compilation
- Précompilation
Compilation séparée : traduction du code en langage machine.
g++ -c fichier_source.cc
Cette opération conduit à la création d’un fichier objet d’extension
.o
(icifichier_source.o
).
Mécanismes de compilation
- Précompilation
- Compilation séparée
Édition de liens : consiste à regrouper la totalité des données de même que les fichiers objets et les bibliothèques (fonctions de la bibliothèque standard et des autres bibliothèques externes) ainsi qu’à résoudre les références inter-fichiers.
g++ fichier_source1.o fichier_source2.o… -o fichier_executable
Mécanismes de compilation
Les trois précédentes étapes peuvent être réalisées en une seule opération via la commande
g++ fichier_source1.cc fichier_source2.cc… -o fichier_executable
Le binaire ainsi généré
fichier_executable
peut alors être exécuté depuis le répertoire local./fichier_executable
Options de compilation
- l'option
-Ichemin
indique au compilateur où sont localisés les fichiers d’en-têtes nécessaires à la compilation séparée du programme. Par défaut, le compilateur recherche ces fichiers localement et dans le répertoire/usr/include
,
- l'option
-W
permet l’activation des messages de mise en garde. Différents niveaux sont accessibles, le plus complet étant-Wall -Wextra
,
- l'option
-Didentificateur
permet la définition d’identificateur à fournir lors du processus de précompilation. L’activation des directives de préprocesseur peut se faire par ce biais.
Démystifier la command ccc
Directives de préprocesseur
Le préprocesseur recherche des directives de compilation repérées en début de
ligne par le symbole #
et se terminant avec la fin de la ligne
#directive [paramètre]
Par exemple,
#include <iostream> #define PI 3.141592
Utilisation de directives de condition
Il est possible de contrôler ce qui sera compilé effectivement ou non, avec les clauses de condition :
#if condition ... #endif
Le code compris dans la séquence #if
– #endif
est considéré par le
compilateur seulement si la condition est vraie (non nulle).
Exemple (1/2)
test_debug.cc
#include <iostream> using namespace std; int main() { #if (DEBUG == 1) cout << "DEBUG: " << "Mode debug du programme" << endl; #else cout << "NOTICE: " << "Mode normal du programme" << endl; #endif }
Compilation :
g++ -DDEBUG=1 test_debug.cc -o test_debug
Exemple (2/2)
dummy.h
#ifndef _dummy_h_ #define _dummy_h_ 1 void dummy(); #endif
dummy.cc
#include "dummy.h" void dummy() {}
test_dummy.cc
#include "dummy.h" int main() { dummy(); }
Compilation :
g++ dummy.cc test_dummy.cc -o test_dummy