Introduction aux outils GNU
Le compilateur C gcc (ou le compilateur C++ g++)
- Compiler le code source main.c pour créer le fichier exécutable main.
gcc main.c -o main
- Un compilateur plus exigeant
On peut utiliser les options suivantes pour que le compilateur soit plus exigeant :
-Wall Warning all
-ansi du C-ansi
-pedantic et que de l'ANSI !
-Werror les warnings sont des erreurs
-W
Les étapes de la compilation
En fait le compilateur
gcc appelle plusieurs programmes pour créer le fichier exécutable.
Il y a 4 étapes :
- Preprocessing
Le préprocesseur remplace les #include, #define par le code correspondant.
- Compilation
Le compilateur produit un fichier assembleur après analyse lexicale et analyse syntaxique
- Assemblage
L'assembleur produit un code machine (fichier objets)
- Edition de lien
L'éditeur de lien relie les fichiers objets entre eux
Compilation en C
Les étapes de la compilation en C++
Preprocessing .cc (.cpp) -> .ii (code C++ après prepocessing)
Compilation .ii -> .S (fichier assembleur)
cc1plus
Assemblage .S -> .o (fichier objet)
Edition de liens .o -> fichier_executable
D'autres options de gcc
- -Ox (avec x=2..)
niveau d'optimisation
- -fvisibility
nouveau dans gcc 4.0
fichier header
.h à inclure
bibliothèque à inclure (
.so shared object)
inclure la libSDL (idem avec n'importe quelle libxyz : on utilise -lxyz)
En général la lib est présente dans le répertoire /usr/lib
permet de générer une bibliothèque dynamique
http://www.xgarreau.org/aide/devel/libclinux/p2.php
Autres compilateurs C
LLVM Low Level Virtual Machine
http://llvm.org/
PCC Portable C compiler
http://pcc.ludd.ltu.se/
SDCC Small Device C Compiler
http://sdcc.sourceforge.net/
D'autres outils pour programmer
- Afficher le type d'un fichier : file
- Afficher les bibliothèques partagées nécessaires : ldd
- Extracteur d'informations symboliques de déboguage : strip
- Profiler : gperf
- Analyseur de taux de couverture : gcov
- Un debugguer/profiler mémoire : valgrind
- ltrace
- dtrace
- strace
- Evaluer la complexité d'un programme
- strip permet d'enlever les informations de debug dans l'exécutable et donc d'avoir un exécutable plus léger.
Makefile
La commande
make permet d'interpréter un fichier Makefile.
Créer un
Makefile permet d'accélérer le processus de compilation car seuls les fichiers modifiés sont compilés, c'est le principe de la compilation séparée.
On crée un fichier objet (
.o) à partir d'un code source (
.c) grâce à l'option
-c de
gcc.
gcc fichier1.c -c crée un fichier fichier1.o
gcc fichier2.c -c crée un fichier fichier2.o
On lie ensuite les deux fichiers objets :
gcc fichier1.o ficher2.o -o fichier_executable
Un
Makefile minimal (sans compilation séparée)
all:
gcc -o main *.c
Quelques articles
http://ftp.traduc.org/doc-vf/gazette-linux/html/2005/120/lg120-D.html Utilisation de la collection de compilateurs de GNU
Autotools
Il s'agit des outils
autoconf,
automake, ...
Ces commandes permettent de créer une installation standard d'un programme à partir des sources via les commandes :
./configure
make
make install
Alternative aux autotools
CMake, qmake, scons, waf, ...
diff / patch
La commande
diff permet de créer un patch.
La commande
patch permet de l'appliquer.
sur des fichiers en local
diff -Nur v1/main.c v2/main.c
-r : récursif
-u : format de sortie unifiée
-N : pour comparaison de rpertoire lorsqu'un fichier est absent
diff -u v1/main.c v2/main.c > patch_v1_v2/main.c.diff (ou
.patch)
patch -p1 < patch_v1_v2/main.c.diff
sur un serveur de version CVS
cvs diff -u > ~/dacode.patch
Autres liens sur le développement avec des outils GNU
- Developing software with GNU (Eleftherios Gkioulekas - Department of Applied Mathematics - University of Washington)
Autres outils
objdump (
binutils) : désassembleur
thumb
Analyse statique de code
GGCC
http://www.ggcc.info
Frama-C
http://frama-c.cea.fr