Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1749 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°817350
farib
Posté le 08-08-2004 à 01:30:30  profilanswer
 

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
mood
Publicité
Posté le 08-08-2004 à 01:30:30  profilanswer
 

n°817359
Taz
bisounours-codeur
Posté le 08-08-2004 à 02:09:18  profilanswer
 

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

n°817363
farib
Posté le 08-08-2004 à 02:12:22  profilanswer
 
n°817367
Taz
bisounours-codeur
Posté le 08-08-2004 à 02:17:24  profilanswer
 

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

n°817368
farib
Posté le 08-08-2004 à 02:18:21  profilanswer
 

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


---------------
Bitcoin, Magical Thinking, and Political Ideology
n°817371
Taz
bisounours-codeur
Posté le 08-08-2004 à 02:23:19  profilanswer
 

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

n°817374
farib
Posté le 08-08-2004 à 02:24:43  profilanswer
 

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
n°817375
Taz
bisounours-codeur
Posté le 08-08-2004 à 02:27:13  profilanswer
 

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

n°817416
farib
Posté le 08-08-2004 à 11:01:58  profilanswer
 

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
n°817817
HelloWorld
Salut tout le monde!
Posté le 09-08-2004 à 10:05:09  profilanswer
 

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
mood
Publicité
Posté le 09-08-2004 à 10:05:09  profilanswer
 

n°817824
farib
Posté le 09-08-2004 à 10:13:17  profilanswer
 

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
n°817838
Taz
bisounours-codeur
Posté le 09-08-2004 à 10:28:05  profilanswer
 

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*

n°817857
farib
Posté le 09-08-2004 à 10:51:56  profilanswer
 

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


---------------
Bitcoin, Magical Thinking, and Political Ideology
n°817875
Taz
bisounours-codeur
Posté le 09-08-2004 à 11:04:14  profilanswer
 

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 ?

n°817926
HelloWorld
Salut tout le monde!
Posté le 09-08-2004 à 11:40:05  profilanswer
 

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
n°817970
farib
Posté le 09-08-2004 à 12:50:51  profilanswer
 

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
n°818138
HelloWorld
Salut tout le monde!
Posté le 09-08-2004 à 15:17:22  profilanswer
 

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
n°818184
farib
Posté le 09-08-2004 à 15:51:05  profilanswer
 


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
n°818213
HelloWorld
Salut tout le monde!
Posté le 09-08-2004 à 16:10:45  profilanswer
 

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
n°818289
farib
Posté le 09-08-2004 à 17:22:53  profilanswer
 

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
n°818302
HelloWorld
Salut tout le monde!
Posté le 09-08-2004 à 17:42:25  profilanswer
 

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
n°818312
farib
Posté le 09-08-2004 à 17:51:46  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
Comment imprimer une page sans le header ni le footer?pbm de redirection avec header
header des mails pour outlookHeader "Return-Path:" dans une fonction mail() ?
[header] Forcer le download[PHP] - Problème avec la fonction header
paiement sécurisé-header et htaccess[RESOLU][HEADER] Solution ultime pour programmer propre ?
Warning: Cannot modify header information[LateX] Changer header
Plus de sujets relatifs à : [C++] Qt, gcc, header précompilé : ça roxe sa maman


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR