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 clean
    • make NDEBUG=1 sharedlib
  • Ne pas oublier de créer les liens
    • ln -s libIrrlicht_debug.so.1.5 libIrrlicht_debug.so
    • ln -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:
#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.