GCC passe la seconde
Par Jean-Seb le dimanche 22 février 2009, 22:27 - Coding - Lien permanent
Insupportable attente des compilations !
Le quad-core refroidi à l'azote tire la langue. Son remplacement est
envisagé.
Avant de courir à mon-galet
, lisez ce qui suit.
Vroum ?
- Quelques secondes de compilation ? C'est toujours trop long.
- Nous avons déja vu comment utiliser un cache de compilation avec Gentoo, voici quelques astuces supplémentaires.
- La situation de départ est celle-ci:
~$ time g++ test.cpp -lIrrlicht -lpng -ljpeg -lGL -lXv -lXxf86vm -I/usr/include/irrlicht real 0m1.513s user 0m1.298s sys 0m0.204s
- Les gens attentifs auront remarqué que la causerie de ce jour va utiliser
Irrlicht en guise d'exemple.
- Irrlicht est un moteur 3D très sympathique, qui charge fortement le processeur à la compilation.
- Les principes énoncés sont bien sûr universels (c'est beau ce que je raconte, on croirait du Zéro-Nain Informatique).
- Au menu:
- Précompilation des entêtes.
- Utilisation de librairies dynamiques, par opposition à la compilation statique.
Quelques précisions sur les libs
- Rappel:
- libIrrlicht.a : lib statique , liée à la compilation (les objets de la lib dont les symboles sont référencés dans le code seront intégrés à l'exécutable)
- libIrrlicht.so : lib dynamique (shared object) , liée à l'exécution (le code est externe à l'exécutable, équivalent des DLLs de MS-Windows)
- Par défaut, si GCC trouve à la fois une librairie statique et une librairie
dynamique du même nom, il choisira la librairie dynamique.
- On peut forcer l'utilisation de la librairie statique avec -static
- Ajouter temporairement un chemin de recherche pour les librairies
dynamiques:
- utiliser la variable d'environnement du shell : LD_LIBRARY_PATH
- pour les changements permanents :
man ldconfig
- Pour les tests sur une machine donnée, on peut se simplifier la vie en
utilisant le flag -rpath .
- ce flag sert à spécifier en dur dans l'exécutable le chemin de recherche des librairies dynamiques.
- ceci n'a aucune influence sur le temps de linkage.
g++ test.cpp -lIrrlicht -lpng -ljpeg -lGL -lXv -lXxf86vm -I/usr/include/irrlicht -L"$HOME"/sources/irrlicht-1.5/lib/Linux/ -Wl,-rpath="$HOME"/sources/irrlicht-1.5/lib/Linux/
Préparation du moteur
- Par défaut, Irrlicht est compilé en statique.
- c'est à dire, une simple archive qui sera intégrée dans l'exécutable à la compilation.
- c'est à dire également, quelques megaoctets de choses inutiles pour le développement.
- pour en savoir plus sur la préparation d'une bibliothèque statique:
man ar
- Bien sûr, tout ceci est surtout valable pour le développement.
- Pour la distribution, je vous conseille de repasser en statique, afin d'être sûr de la version distribuée.
- Aller dans les sources de Irrlicht
make sharedlib
- Par défaut, Irrlicht est construit avec les symboles de debug.
- Il peut être utile de ne pas les avoir (on ne débuggera pas forcément tout le temps).
- Aller dans le répertoire libs.
- Vous devez trouver un fichier de ce type: libIrrlicht.so.1.5 (ou un autre numéro de version).
mv libIrrlicht.so.1.5 libIrrlicht_debug.so.1.5
- Retourner dans le répertoire source de Irrlicht
make cleanmake NDEBUG=1 sharedlib
- Ne pas oublier de créer les liens
ln -s libIrrlicht_debug.so.1.5 libIrrlicht_debug.soln -s libIrrlicht.so.1.5 libIrrlicht.so
- Nous pouvons déja tester le progrès avec la librairie dynamique
- Nous indiquons le chemin de la lib dynamique avec le flag -L de GCC
- Si nous ne faisons pas cela, les chemins par défaut seront utilisés, et Irrlicht sera linké en statique.
~$ time g++ test.cpp -lIrrlicht -lpng -ljpeg -lGL -lXv -lXxf86vm -I/usr/include/irrlicht -L"$HOME"/sources/irrlicht-1.5/lib/Linux/ real 0m0.879s user 0m0.770s sys 0m0.101s
Compilation des entêtes
- On ne dirait pas, mais un include peut augmenter significativement
le temps de compilation.
- de même que VisualC++, GCC peut les précompiler pour gagner du temps.
- Le fichier source doit débuter par un include qui contiendra lui
même tous les includes du projet.
- Ex:
#include "projet.h" - projet.h contiendra:
- Ex:
#include <math.h> #include <irrlicht.h>
- On le compile de cette façon:
g++ projet.h -I/usr/include/irrlicht
- Normalement, vous devez obtenir un gros fichier nommé
projet.h.gch
- Si vos entêtes ne sont pas dans le chemin de recherche de gcc, n'oubliez pas d'utiliser le flag -I , comme je l'ai fait ci-dessus.
- Plus qu'à tester:
~/coding/irrlicht$ time g++ test.cpp -lIrrlicht -lpng -ljpeg -lGL -lXv -lXxf86vm -I/usr/include/irrlicht -L"$HOME"/sources/irrlicht-1.5/lib/Linux/ -Wl,-rpath="$HOME"/sources/irrlicht-1.5/lib/Linux/ real 0m0.519s user 0m0.444s sys 0m0.069s
- Le gain par rapport au temps mis par la compilation en introduction est sans appel.
- Un makefile sera tout de même appréciable, ne serait-ce que pour gérer les
dépendances des entêtes.
- Sa conception est laissée à titre d'exercice au lecteur.
Vroum!
- Et voila, avec quelques manoeuvres simples, nous nous retrouvons avec une machine à la nouvelle jeunesse.
- Avec l'argent économisé, vous pouvez faire un don
sur mon compte offshoreà ma fondation pour la réinsertion des Anciens de l'AS/400.