8
votes

Modèle de précompiled_header et de sous-dirons sur qt

J'ai un grand projet QT, séparé sur plusieurs bibliothèques statiques (environ 70) et une application, et pour cela, j'utilise un fichier .pro avec le modèle de sous-résidents.

Pour accélérer le temps de compilation, je souhaite utiliser des en-têtes précompilés et constaté que l'utilisation de la précompiled_header sur chaque sous-projet fait l'affaire, mais que chaque projet compare l'en-tête précompilé séparément (et que l'une est la plus lente étape).

Il existe un moyen de "partager" l'en-tête précompilé entre tous les sous-projets incluses sur le modèle de sous-réprimés?, de sorte que l'en-tête précompilé peut être construit une fois et être utilisé par tous les sous-produits?

considère


2 commentaires

Si vous avez résolu cela, je serais intéressé par la réponse


Malheureusement, je n'ai jamais trouvé la façon de le faire


5 Réponses :


0
votes

Si chaque en-tête serait compilé séparément à sa propre pCH, cela pourrait alors fonctionner. Malheureusement, autant que je sache, dans des projets C ++, il n'y a qu'une seule unité de traduction pour les en-têtes précompilés pouvant être utilisés à l'échelle mondiale par projet. Eh bien, vous pouvez utiliser un fichier global pour tous vos projets, mais c'est-à-dire efficace: cela peut entraîner une augmentation des heures de construction, car chaque en-tête précompilé est modifié, tout doit être reconstruit.


1 commentaires

L'idée est que l'en-tête précompilé ne changera pas, je veux mettre tous les trucs spécifiques QT et rien d'autre. Mais il y a de la manière avec qmake de faire ce fichier global?



0
votes

Juste une suggestion - vous voudrez peut-être essayer d'utiliser Cmake. Il a à la fois un support QT et PCH, et il s'agit du support PCH actuel souffre du même problème. Les macros liées à la PCH entrent dans un fichier séparé pour comprendre et peuvent être réécrites de faire un seul fichier de gros pch pour de nombreux sous-dossiers. C'est comme ça que j'ai l'intention de résoudre le même problème pour mon projet QT.


0 commentaires

3
votes

Après une certaine expérimentation, je n'ai trouvé aucun moyen de partager un en-tête précompilé entre les sous-projets. Je pense que la justification de l'absence de cette fonctionnalité est que chaque sous-projet peut modifier des drapeaux de compilateur / préprocesseur qui feraient construire des en-têtes précompilés pour une sous-projet incompatible avec d'autres sous-projets.

L'en-tête de précompilisation partagée pourrait être utile pour certains projets simples où des drapeaux de compilateur sont également partagés, mais je suppose que la détection et la manipulation des écarts de cette maladie seraient trop tracas pour le QMake.


1 commentaires

En cas de drapeaux de compilateur / préprocesseur très identiques pour divers sous-projets, comment l'atteindriez-vous? Un sous-projet générant la PCH et l'autre l'utiliser? Si oui, comment utiliser simplement la PCH pour les autres sous-projets? Merci :)



2
votes

Pas de chemin officiel malheureusement. Vous pouvez utiliser des hacks cependant pour obtenir un support de PCH basique.

J'ai utilisé xxx

dans un projet qui crée simplement le fichier .pch, puis "simuler" le 2e la moitié de précompiled_header dans un fichier commun .pri pour les projets réels. Par exemple. Avec vs, vous utiliseriez quelque chose comme: xxx

Vous pouvez rencontrer différents problèmes, par exemple.

  • Si les drapeaux du compilateur diffèrent trop (voir WD4651 ci-dessus).
  • Cela ne fonctionne pas non plus sur Ootb avec des fichiers PDB. Utiliser / z7 à la place.
  • avec GCC, vous pourriez rencontrer des options incompatibles -fic.
  • etc.

1 commentaires

Merci pour cette bonne idée, est-il possible de le faire pour d'autres compilateurs comme Mingw / XCode?



0
votes

Il n'y a aucun moyen de le faire si vous utilisez qmake.exe. QMake Binary a construit des drapeaux qui disent à créer (-YC) pCH pour chaque projet. Il n'y a aucun moyen de le couper.


0 commentaires