[C++] Qt, gcc, header précompilé : ça roxe sa maman

Qt, gcc, header précompilé : ça roxe sa maman [C++] - C++ - Programmation

Marsh Posté le 08-08-2004 à 01:30:30    

les headers précompilés, ça change un peut tout dans la compilation des programmes c++ et Qt, c'est carrément un pas de géant pour l'humanité
 
sur mon petit prog de merde la ( le raytracer )
 
temps de compilation (XP 1700+)
___
 
projet original
make  45,95s user 2,16s system 83% cpu 57,713 total
 
__
 
projet remanié avec tous les headers "fixes" dans le all.h.  
Les headers STL, iostream & co.
Les headers Qt, qlabel.h, qwidget.h, & co
 
En effet, gcc ne sait utiliser, pour l'instant, qu'un seul header précompilé, bon en pratique, ca marche très bien, on bourrinne tout dans le all.h
 
make  63,85s user 2,68s system 92% cpu 1:11,73 total
 
__
 
projet utilisant le all.h précompilé
make 12,70s user 1,29s system 88% cpu 15,873 total
 
__
 
 
 
La précompilation du header all.h, qui contient TOUS les include QT & STL  prend elle 8 secondes...
 
__
 
maintenant, je compare sur un seul fichier, quand on modifie un fichier simple et qu'on recompile de suite pour tester  
 
sur un fichier qui avait gardé ses headers nécessaires strictement ( pas le all.h)
make  3,39s user 0,21s system 94% cpu 3,791 total
 
avec header all.h précompilé
make  0,89s user 0,11s system 96% cpu 1,038 total
____
 
hébé, dire qu'on s'est fait chier pendant tout ce temps là à attendre que Qt & M. C++ prenne son temps...
 
A noter, j'ai pas réellement insisté, mais j'ai pas réussi à faire prendre en compte le header précompilé à qmake ( alors qu'il est sensé le gérer ) et du coup j'ai modifié le makefile à la mano, mais c'est pas super grave.
 
Ca va etre moins ridicule que la compilation sous visualC++, maintenant.


Message édité par farib le 08-08-2004 à 01:36:35

---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 08-08-2004 à 01:30:30   

Reply

Marsh Posté le 08-08-2004 à 02:09:18    

t'as essayé tout simplement de faire une règle pour les .h :o comme tu changes rien et ça marche tout seul. pas la peine de faire des très mauvais all.h

Reply

Marsh Posté le 08-08-2004 à 02:12:22    

Reply

Marsh Posté le 08-08-2004 à 02:17:24    

ben tu rajoute un un règle *.gph : *.h ... et 2 bidules dans ton makefile et tout va se faire tout seul, pas la peine de foutre ton projet en l'air avec un daubique all.h

Reply

Marsh Posté le 08-08-2004 à 02:18:21    

t au courant que gcc ne gère l'utilisation que d'un seul header précompilé ?


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 08-08-2004 à 02:23:19    

sans déconner ? c'est naz ça ... ben alors c'est vraiment de la technologie preview, je vais pas me faire chier à modifier ne serait qu'un seul Makefile ... puisqu'il faut changer toucher aussi au reste. RAB, distcc + ccache powa :o

Reply

Marsh Posté le 08-08-2004 à 02:24:43    

Taz a écrit :

sans déconner ? c'est naz ça ... ben alors c'est vraiment de la technologie preview, je vais pas me faire chier à modifier ne serait qu'un seul Makefile ... puisqu'il faut changer toucher aussi au reste. RAB, distcc + ccache powa :o


évidemment que c'est de la technology preview
 
il n'empeche, le plus dur a été fait ( maitenant, c'est le travail relou d'implémenter la gestion header par header )
 
 
et ccache j'ai testé ça améliore de 0  :heink:


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 08-08-2004 à 02:27:13    

la première fois ça améliore rien, après, ça marche terrible.
 
sinon y a peut être moyen de faire un all.pch customisé pour chaque fichier, avec Make ça doit commencer à être chiant, par contre avec d'autres outils ça doit bien se faire je pense

Reply

Marsh Posté le 08-08-2004 à 11:01:58    

ah tiens ouais ça marche ccache :o
 
 
comment ça fait pour fonctionner ?
c'est vrai que c'est super rapide, tellement ça parait absurde que ce soit pas écrit en gros de l'utiliser avec Qt
 
A comparer avec l'intéret des headers précompilés, bein le header précompilé, c'est que ça marche dès la première compile
 
 
sinon, tu intégres comment ccache toi ?
 
dans la variable CXX ?


Message édité par farib le 08-08-2004 à 11:41:43

---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 09-08-2004 à 10:05:09    

Sous VC++ au moins, on peut pas utiliser les entêtes précompilées avec Qt, car il faut que tous les fichiers utilisent cette entête précompilée, et ce n'est pas le cas des fichiers générés par Qt via la moc. Du coup, su t'utilises Designer et donc moc, ben pas de header précompilé.
Tu peux tout de même améliorer le temps de compile en déclarant les classes dans le .h et en les incluant dans le .cpp au lieu de les inclure dans le .h, quand c'est possible évidemment :

Code :
  1. // .h
  2. #include <qwidget.h>
  3. // au lieu d'inclure qlineedit.h et qbutton.h ici, on le fait dans le .cpp
  4. class QLineEdit;
  5. class QButton;
  6. class MyWidget : public QWidget
  7. {
  8. public:
  9.     MyWidget();
  10. private:
  11.     QLineEdit * edit;
  12.     QButton   * button;
  13. };
  14. // .cpp
  15. #include <qlineedit.h>
  16. #include <qbutton.h>
  17. MyWidget::MyWidget()
  18. {
  19.     this->edit = new QLineEdit( this );
  20.     this->button = new QButton( this );
  21. }


Le gain est d'autant plus appréciable qu'il y a des #include "MyWidget.h" dans ton projet.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 09-08-2004 à 10:05:09   

Reply

Marsh Posté le 09-08-2004 à 10:13:17    

helloworld:
 
c'est toujours comme ça qu'il faut faire et que je fais, hein,  dans mes .h, il n'y a que des pré-déclarations de classe.
 
 
sinon Qt dans sa version 3.3, bein la doc elle parle bien de VC++, donc ça devrait fonctionner sans probleme


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 09-08-2004 à 10:28:05    

farib a écrit :


sinon, tu intégres comment ccache toi ?
 
dans la variable CXX ?

non, j'ai un ~/bin, j'y ai fait des liens
 
ll ~/bin | grep ccache
lrwxrwxrwx  1 benoit benoit   15 2004-08-09 10:27 c++ -> /usr/bin/ccache*
lrwxrwxrwx  1 benoit benoit   15 2004-05-26 15:21 cc -> /usr/bin/ccache*
lrwxrwxrwx  1 benoit benoit   15 2004-05-26 15:21 g++ -> /usr/bin/ccache*
lrwxrwxrwx  1 benoit benoit   15 2004-05-26 15:21 gcc -> /usr/bin/ccache*

Reply

Marsh Posté le 09-08-2004 à 10:51:56    

j'ai fait ça et je me mange des files not found quand je fais
 
"gcc"


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 09-08-2004 à 11:04:14    

benoit@athlon >>> which gcc
/home/benoit/bin/gcc
 
[11:03:50][pts/1][~/tmp/broadcastavenue.com/StarCraft][#14][&0]
benoit@athlon >>> gcc --version
gcc (GCC) 3.3.4 (Debian 1:3.3.4-7)
Copyright (C) 2003 Free Software Foundation, Inc.
Ce logiciel est libre; voir les sources pour les conditions de copie.  Il n'y a PAS
GARANTIE; ni implicite pour le MARCHANDAGE ou pour un BUT PARTICULIER.
 
 
 
t'es sur de l'emplacement de ton ccache ?

Reply

Marsh Posté le 09-08-2004 à 11:40:05    

farib a écrit :

sinon Qt dans sa version 3.3, bein la doc elle parle bien de VC++, donc ça devrait fonctionner sans probleme


parler de VC++... le probleme il est pas là, biensûr qu'on peut utiliser Qt avec VC++. Mais je n'ai pas réussi (et je suis pas le seul) à utiliser les entêtes précompilées dans un projet avec des fichiers générés par moc. Il faudrait une option dans moc qui permette d'ajouter un include (=> l'include précompilé), option qui n'existe pas à ma connaissance. Sinon il faut bidouiller...
Je n'ai jamais utilisé les pch avec g++, je ne sais pas si l'inclusion du pch dans chaque fichier source est obligatoire ou non.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 09-08-2004 à 12:50:51    

euh y'a rien qui change entre visual et gcc hein
 
 
les moc y'en a tout le temps  :heink:  
 
je vois ce que tu veux dire
mais si j'ai dans un .moc
 

Code :
  1. #include "paramballs.h"
  2. #include <qmetaobject.h>
  3. #include <qapplication.h>


en fait ça sera bon
 
dans le paramballs.h j'ai le include all.h qui contient déja  
#include <qmetaobject.h>
#include <qapplication.h>
 
et grace aux #ifdef, les #include du .moc seront ignorés.
 
taz : tu peux me faire un ls -l /usr/bin/gcc & g++


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 09-08-2004 à 15:17:22    

Et comment tu fais rajouter ton #include "paramballs.h" par moc ?
et même ça marche pas, paramballs.h doit être le fichier précompilé. La première ligne de ton cpp doit être #include "all.h"
Je rappelle que les fichiers moc sont générés par moc.exe, donc si toi tu modifies le fichier généré, celui-ci sera tot ou tard effacé et regénéré par moc et tes modifs seront perdues.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 09-08-2004 à 15:51:05    


moc_paramballs.cpp contient TOUJOURS #include "paramballs.h" ( c'est généré comme ça
 
 
le paramballs.h contient lui un #include "all.h"
 


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 09-08-2004 à 16:10:45    

farib a écrit :

moc_paramballs.cpp contient TOUJOURS #include "paramballs.h" ( c'est généré comme ça
 
 
le paramballs.h contient lui un #include "all.h"


ah... j'avais pas vu le "moc_" devant... donc "moc_XXX.cpp" contient toujours "#include "XXX.h"". Je suis d'accord. Mais ça n'aide pas. J'ai un fichier précompilé, all.h, qui doit toujours être inclu en premier :

Code :
  1. // moc_paramballs.cpp  
  2. #include "all.h"
  3. #include "paramballs.h"


Les pch, sous VC++ du moins, ça marche comme ça. Le pch ne doit pas être inclu dans des .h mais dans des .cpp avant les .h associé.
Y'a une méthode automatique aussi, mais j'ai jamais testé.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 09-08-2004 à 17:22:53    

hum, tu penses pas que ça n'a pas d'importance que le pch/header soit inclut dans le moc ou pas ?
 
au premier parsage du préprocesseur, il incluera le .h.
 
il finira bien par réinclure le all.h
 
c'est si important que cela ?


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 09-08-2004 à 17:42:25    

farib a écrit :

hum, tu penses pas que ça n'a pas d'importance que le pch/header soit inclut dans le moc ou pas ?
 
au premier parsage du préprocesseur, il incluera le .h.
 
il finira bien par réinclure le all.h
 
c'est si important que cela ?


c'est pas ce que je pense qui est important, mais comment VC++ gère le truc, et ça se passe comme ça. Sinon c'est :

Citation :

fatal error C1010: fin de fichier inattendue lors de la recherche d'une directive d'en-tête précompilé


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 09-08-2004 à 17:51:46    

arf, ouais, avec g++ c'est pas comme ça
 
 
cela dit, dans la doc de qt, y'a des exemples explicite sur comment faire un .pro pour qmake qui prenne en compte les headers précompilés sous Windows/VC++
 
ça marche po ça ?
 
http://doc.trolltech.com/3.3/qmake-manual-7.html


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed