La manipulation stdafx.h à croix-plate-forme de code
J'ai un Visual Studio C++ qui utilise les en-têtes précompilés (stdafx.h
). Maintenant, nous sommes le portage de l'application pour Linux avec gcc 4.x.
La question est de savoir comment gérer les en-tête précompilé dans les deux environnements.
J'ai googlé, mais ne peut pas venir à une conclusion.
Évidemment, je veux laisser stdafx.h
dans Visual Studio depuis la base de code est assez grand et les en-têtes précompilés boost moment de la compilation.
Mais la question est de savoir quoi faire dans Linux. C'est ce que j'ai trouvé:
- Quitter le
stdafx.h
comme est. gcc compile le code considérables plus vite que VC++ (ou c'est juste ma machine Linux est plus fort ... 🙂 ), j'ai donc peut-être heureux avec cette option. -
Utilisation de l'approche de ici - faire
stdafx.h
ressembler (setUSE_PRECOMPILED_HEADER
pour VS uniquement):#ifdef USE_PRECOMPILED_HEADER ... my stuff #endif
-
Utiliser l'approche de ici - compiler VC++ avec
/FI
à implicitement inclurestdafx.h
dans chaque fichier cpp. Par conséquent, VS, votre code peut être commutée facilement à être compilé sans les en-têtes précompilés et pas de code devra être changé.
Personnellement, je l'aversion des dépendances et le désordrestdafx.h
est de pousser une grosse base de code vers. Par conséquent, l'option est intéressant pour moi, sur Linux, vous n'avez passtdafx.h
, tout en étant capable de tourner sur les en-têtes précompilés sur VS par/FI
seulement. - Sur Linux compiler
stdafx.h
seulement comme un en-tête précompilé (imiter Visual Studio)
Votre avis? Il existe d'autres approches pour traiter le problème?
Vous devez vous connecter pour publier un commentaire.
Vous êtes le meilleur off à l'aide des en-têtes précompilés pour toujours plus rapide de la compilation.
Vous pouvez utiliser les en-têtes précompilés dans gcc en tant que bien. Voir ici.
La compilation d'en-tête précompilé aura une extension ajouté que
.gch
au lieu de.pch
.Par exemple, si vous précompiler stdafx.h vous aurez un fichier d'en-tête qui sera automatiquement recherchées appelé
stdafx.h.gch
à tout moment vous d'inclurestdafx.h
Exemple:
stdafx.h:
a.cpp:
Puis compilez comme:
Votre compilation fonctionne même si vous supprimez stdafx.h après l'étape 1.
J'ai utilisé option 3 dernière fois que j'ai besoin de faire cette même chose. Mon projet était assez petite, mais cela a fonctionné à merveille.
J'avais soit aller pour l'option 4 option 2 ou les deux. J'ai expérimenté avec les en-têtes précompilés sur divers VS versions et GCC sous Linux (posts à ce sujet ici et ici). Dans mon expérience, VS est beaucoup plus sensible à la longueur des chemins d'inclusion, le nombre de répertoires dans le chemin d'inclusion, et le nombre de fichiers à inclure de G++. Lorsque j'ai mesuré les temps de construire correctement disposés les en-têtes précompilés serait faire une énorme différence au moment de la compilation sous VS alors que G++ été très impressionné par cette.
En fait, fondée sur le dessus de ce que j'ai fait la dernière fois que j'ai travaillé sur un projet où cela a été nécessaire de réduire le temps de compilation a été précompiler l'équivalent de stdafx.h sous Windows où il fait sens et tout simplement utilisé comme un fichier normal sous Linux.
Solution très simple.
Ajouter un fichier fictif entrée pour "stdafx.h" dans un environnement Linux.
Je tiens seulement à utiliser l'option 1 dans une grande équipe de développeurs.
Les Options 2, 3, et 4, seront souvent interrompre la productivité des autres membres de votre équipe, donc vous peut sauver quelques minutes par jour au moment de la compilation.
Voici pourquoi:
Supposons que la moitié de vos développeurs utilisent VS et la moitié d'utiliser gcc.
Chaque maintenant et puis certains VS développeur oubliez pas d'inclure un en-tête dans un .fichier cpp.
Il ne sera pas d'avis, parce que le stdafx.h comprend implicitement il. Donc, il pousse ses changements dans le contrôle de version, et puis quelques autres membres de l'équipe de gcc obtiendrez des erreurs du compilateur.
Donc, pour toutes les 5 minutes par jour vous gagnez en utilisant les en-têtes précompilés, 5 autres personnes de déchets par la fixation de votre manquants en-têtes.
Si vous ne partagez pas le même code sur l'ensemble de vos compilateurs, vous serez confronté à des problèmes comme ça tous les jours. Si vous forcez votre VS développeurs de vérifier pour la compilation de gcc avant de pousser des changements, puis vous jetez tous vos gains de productivité en utilisant les en-têtes précompilés.
Option 4 semble intéressant, mais que faire si vous souhaitez utiliser un autre compilateur à un certain point dans le temps ? Option 4 ne fonctionne que si vous utilisez uniquement VS et de la gcc.
Avis que l'option 1 pourrait faire de la compilation de gcc souffrir de quelques secondes. Bien qu'il ne soit pas perceptible.
C'est simple, vraiment:
Projet->Paramètres du Projet (Alt + F7)
Projet-Paramètres-Dialogue:
C++ -> Catégorie: les en-Têtes Précompilés -> Headers Précompilés boutons radio --> désactiver
Depuis
stdafx.h
est, par défaut, toutes les Fenêtres spécifique des choses, j'ai mis un videstdafx.h
sur mon autre plate-forme. De cette façon, votre code source reste identique, tout en désactivantstdafx
sur Linux sans avoir à enlever toutes les#include "stdafx.h"
lignes à partir de votre code.Si vous êtes en utilisant CMake dans votre projet, il existe des modules qui permet d'automatiser pour vous, très pratique, par exemple, voir cmake-fichier d'en-tête ici. Pour l'utiliser, il suffit d'inclure le module et l'appeler:
Un autre module appelé Cotire crée le fichier d'en-tête pour être précompilés (pas besoin de l'écrire manuellement StdAfx.h) et des vitesses allant jusqu'construit par d'autres moyens - voir ici.
Je l'ai fait à la fois l'option 2 (#ifdef) et l'option 4 (PCH pour gcc) pour la croix-plate-forme de code avec pas de problèmes.
Je trouve gcc compile beaucoup plus rapide que VS si les en-têtes précompilés sont généralement pas si important que cela, à moins que vous ne fassiez référence à un énorme fichier d'en-tête.
J'ai une situation où #2 en particulier ne fonctionne pas pour moi (Il y a de nombreux VS construire des configs où un
#ifdef
autour de#include "stdafx.h"
ne fonctionne pas). D'autres solutions ont été sous-optimale car les fichiers étaient eux-mêmes des projets, ainsi que d'être multi-plateforme. Je n'ai pas envie de forcer les macros du préprocesseur de définir ou de la force de linux ou même windows construit à l'utilisation (ou la non-utilisation) pch, alors...Ce que j'ai fait, étant donné un fichier nommé
notificationEngine.cpp
, par exemple, a été enlevé le#include stdafx.h
ligne complètement, créé un nouveau fichier dans le même répertoire appelépchNotificationEngine.cpp
avec le contenu suivant:Un projet donné peut inclure la version correcte du fichier. Certes ce n'est probablement pas la meilleure option pour les fichiers cpp qui ne sont utilisés que par un seul projet.
The compiler for main just needs the function/class declarations (.hpp), not the implementations/definitions. The linker finds those. #includeing .cpp files can be done but is incredibly bizarre.