J'ai vu quelques (vieux) messages sur le net sur le piratage ensemble, un support pour les en-têtes pré-compilés dans CMake. Ils semblent tous un peu partout et chacun a sa propre façon de faire. Quelle est la meilleure façon de le faire actuellement?
c++
visual-studio
gcc
cmake
precompiled-headers
Glutineux
la source
la source
J'utilise la macro suivante pour générer et utiliser des en-têtes précompilés:
Disons que vous avez une variable $ {MySources} avec tous vos fichiers source, le code que vous voudriez utiliser serait simplement
Le code fonctionnerait toujours très bien sur les plates-formes non MSVC également. Génial :)
la source
list( APPEND ... )
extérieur de la fermetureendif()
. Voir le code complet ici: pastebin.com/84dm5rXZ/Yu
et/FI
, ils devraient l'être${PrecompiledHeader}
et non${PrecompiledBinary}
./YuC:/foo/bar.h
, vous forcera à passer l'/FpC:/foo/bar.h
indicateur ou à placer#include <C:/foo/bar.h>
en haut de tous vos fichiers .cpp comme première instruction d'inclusion. MSVC effectue une comparaison de chaîne des#include
arguments, il ne vérifie pas s'il pointe vers le même fichier que celui auquel il a été donné/Yu
. Ergo,#include <bar.h>
ne fonctionnera pas et émettra l'erreur C2857.CMake vient d'obtenir le support des PCH, il devrait être disponible dans la prochaine version 3.16, prévue pour le 01/10/2019:
https://gitlab.kitware.com/cmake/cmake/merge_requests/3553
Des discussions sont en cours sur la prise en charge du partage des PCH entre les cibles: https://gitlab.kitware.com/cmake/cmake/issues/19659
Un contexte supplémentaire (motivation, chiffres) est disponible sur https://blog.qt.io/blog/2019/08/01/precompiled-headers-and-unity-jumbo-builds-in-upcoming-cmake/
la source
Voici un extrait de code pour vous permettre d'utiliser un en-tête précompilé pour votre projet. Ajoutez ce qui suit à votre CMakeLists.txt en remplaçant
myprecompiledheaders
etmyproject_SOURCE_FILES
le cas échéant:la source
with set( CMAKE_AUTOMOC ON )
.myprecompiledheader.cpp
est compilé en premier? D'après cet extrait de code, il semble qu'il sera compilé en dernier, c'est peut-être ce qui pourrait causer le retard.myprecompiledheader.h
contient uniquement les en-têtes STL les plus courants que mon code utilise.J'ai fini par utiliser une version adaptée de la macro larsm. L'utilisation de $ (IntDir) pour le chemin pch permet de séparer les en-têtes précompilés pour les versions de débogage et de publication.
la source
Adapté de Dave, mais plus efficace (définit les propriétés de la cible, pas pour chaque fichier):
la source
abc
dans votre exemple?si vous ne voulez pas réinventer la roue, utilisez simplement Cotire comme le suggère la première réponse ou un plus simple - cmake-precompiled-header ici . Pour l'utiliser, il suffit d'inclure le module et d'appeler:
la source
CMake 3.16 a introduit la prise en charge des en-têtes précompilés. Il existe une nouvelle commande CMake
target_precompile_headers
qui fait tout ce dont vous avez besoin sous le capot. Voir sa documentation pour plus de détails: https://cmake.org/cmake/help/latest/command/target_precompile_headers.htmlla source
Un exemple d'utilisation d'en-tête précompilé avec cmake et Visual Studio 2015
"stdafx.h", "stdafx.cpp" - nom d'en-tête précompilé.
Mettez ce qui suit ci-dessous dans le fichier cmake racine.
Mettez ce qui suit ci-dessous dans le fichier cmake du projet.
"src" - un dossier avec les fichiers source.
la source
À mon humble avis, le meilleur moyen est de définir PCH pour l'ensemble du projet, comme martjno l'a suggéré, combiné avec la capacité d'ignorer PCH pour certaines sources si nécessaire (par exemple, les sources générées):
Donc, si vous avez une cible MY_TARGET et une liste de sources générées IGNORE_PCH_SRC_LIST, vous ferez simplement:
Cette approche est testée et fonctionne parfaitement.
la source
Eh bien, lorsque les builds prennent plus de 10 minutes sur une machine quad core chaque fois que vous modifiez une seule ligne dans l'un des fichiers de projet, il vous indique qu'il est temps d'ajouter des en-têtes précompilés pour Windows. Sur * nux, j'utiliserais simplement ccache et je ne m'en soucierais pas.
J'ai implémenté dans mon application principale et quelques-unes des bibliothèques qu'elle utilise. Cela fonctionne très bien jusqu'à présent. Une chose qui est également nécessaire est que vous devez créer la source pch et le fichier d'en-tête et inclure dans le fichier source tous les en-têtes que vous souhaitez précompiler. J'ai fait ça pendant 12 ans avec MFC mais il m'a fallu quelques minutes pour m'en souvenir.
la source
Le moyen le plus simple est d'ajouter l'option précompilée en tant qu'option globale. Dans le fichier vcxproj, cela apparaîtra comme
<PrecompiledHeader>Use</PrecompiledHeader>
et ne le fera pas pour chaque fichier individuel.Ensuite, vous devez ajouter l'
Create
option à StdAfx.cpp. Voici comment je l'utilise:Ceci est testé et fonctionne pour MSVC 2010 et créera un fichier MyDll.pch, je ne suis pas dérangé par le nom de fichier utilisé, je n'ai donc fait aucun effort pour le spécifier.
la source
Comme l'option d'en-tête précompilée ne fonctionne pas pour les fichiers rc, j'ai dû ajuster la macro fournie par jari.
Edit: L'utilisation de ces en-têtes précompilés a réduit le temps de construction global de mon projet principal de 4min 30s à 1min 40s. C'est pour moi une très bonne chose. Dans l'en-tête de précompilation se trouvent uniquement des en-têtes tels que boost / stl / Windows / mfc.
la source
N'y allez même pas. Les en-têtes précompilés signifient que chaque fois qu'un des en-têtes change, vous devez tout reconstruire . Vous avez de la chance si vous avez un système de construction qui s'en rend compte. Plus souvent que jamais, votre build échouera jusqu'à ce que vous vous rendiez compte que vous avez changé quelque chose qui est en cours de précompilation, et que vous devez donc effectuer une reconstruction complète. Vous pouvez éviter cela principalement en précompilant les en-têtes dont vous êtes absolument sûr qu'ils ne changeront pas, mais vous abandonnez également une grande partie du gain de vitesse.
L'autre problème est que votre espace de noms est pollué par toutes sortes de symboles que vous ne connaissez pas ou dont vous ne vous souciez pas dans de nombreux endroits où vous utiliseriez les en-têtes précompilés.
la source