Devel



Introduction aux outils de dévéloppement (GNU et autres...)




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

- Compiler facilement depuis emacs
Ajouter à la première ligne
// -*- compile-command: "gcc -g main.c" -*-

- 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


- Preprocessing .c -> .i (code C après prepocessing)
cpp : C prepocessor
gcc -E principal.c -o principal.i

- Compilation .i -> .s (fichier assembleur)
/usr/lib/gcc-lib/i486-linux/3.3.5/cc1 (cc1)
gcc -S principal.c -o principal.s

- Assemblage .s -> .o (fichier objet)
as : GNU Assembler
gcc -c principal.c -o principal.o

- Edition de liens .o -> fichier_executable
ld : GNU Linker
ld -o executable principal.o autre.o -lc
gcc principal.o -o executable

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

- -o
gcc main.c -o main
output (nom de executable)

- -v
mode verbeux (affiche les étapes de la compilation)

- -E
gcc -E -o main.E main.c
arrête la compilation après le préprocesseur

- -S
gcc -S -o main.s main.c
pour obtenir de l'assembleur

- -c
gcc -c -o autre.o autre.c
gcc -c autre.c
arrête la compilation avant l'édition de lien
crée un fichier objet .o
C'est une option très utile pour créer un Makefile avec compilation séparée (on peut redonner à gcc des fichiers .o et des .c pour linker)
gcc -c -o main main.c autre.o

- -Ox (avec x=2..)
niveau d'optimisation

- -march=xxx

- -mcpu=xxx

- -fvisibility
nouveau dans gcc 4.0

- -I/usr/local/include
fichier header .h à inclure

- -L/usr/local/lib
bibliothèque à inclure (.so shared object)
http://fr.wikipedia.org/wiki/Biblioth%C3%A8que_logicielle
http://en.wikipedia.org/wiki/Library_%28computing%29

- -lSDL
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

- -shared
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.

Bibliothèques

http://tldp.org/HOWTO/Program-Library-HOWTO/
ldconfig
LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/qwt-5.1.2-svn/lib/

Debug



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

- man make
- info make
- http://www.gnu.org/software/make
- http://fr.wikipedia.org/wiki/Make
- http://www.djefer.com/articles/make
- http://www.april.org/groupes/doc/make/make.html

Un Makefile minimal (sans compilation séparée)
all:
gcc -o main *.c


Un Makefile minimal avec compilation séparée
all: main
main: main.o
gcc $? -o $@
main.o: main.c
gcc -c $<

http://www.gnu.org/software/make/manual/make.html#Automatic-Variables

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

- info autoconf
- http://www.gnu.org/software/autoconf

- info automake
- http://www.gnu.org/software/automake
- http://sources.redhat.com/automake

- http://sources.redhat.com/autobook
- http://sourceware.org/autobook/download.html
- http://mdcc.cx/pub/autobook/

- http://autotoolset.sourceforge.net
- http://home.tele2.fr/cheznarberd/autotools/index.html

Alternative aux autotools

CMake
http://www.unixgarden.com/index.php/programmation/cmake%E2%80%AF-la-releve-dans-la-construction-de-projets
http://www.unixgarden.com/index.php/programmation/quelques-exemples-d%E2%80%99utilisation-de-cmake

qmake

scons

waf, ...

Comparatif de systèmes de constructions / Benchmarks of various build tools
http://retropaganda.info/~bohan/work/sf/psycle/branches/bohan/wonderbuild/benchmarks/time.xml

diff / patch

La commande diff permet de créer un patch.
La commande patch permet de l'appliquer.

- man diff
- man patch

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



internationalization (i18n) / localization(l10n)




Autres liens sur le développement avec des outils GNU

- Developing software with GNU (Eleftherios Gkioulekas - Department of Applied Mathematics - University of Washington)

http://www.amath.washington.edu/~lf/tutorials/autoconf/toolsmanual_toc.html
http://www.google.fr/search?hl=fr&q=developing+software+with+gnu
http://www.cnfreeos.org/Document/developing_software_with_gnu.pdf
http://nix-adm.org/Document/developing_software_with_gnu.pdf

Autres outils

objdump (binutils) : désassembleur
thumb

Cross-compilation / compilation croisée


Debuggage de cible distante


Analyse statique de code

GGCC http://www.ggcc.info
Frama-C http://frama-c.cea.fr

Automatisation de compilations / intégration continue / continuous integration



Code linter / code formatter

Python flake8

Outil multilangage
Coala https://coala.io/

ClangFormat https://clang.llvm.org/docs/ClangFormat.html

Pre-commit Git

https://pre-commit.com/

Gestionnaire de dépendance de bibliothèques

vcpkg - VC++ Packaging Tool
conan https://conan.io/
hunter https://docs.hunter.sh/
cpm http://www.cpm.rocks/
cget http://cget.readthedocs.io/
buckaroo https://buckaroo.pm/
cppan https://github.com/cppan/cppan

voir aussi :
- DevelVersionManagement

There are no comments on this page. [Add comment]

Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by WikkaWiki