54 votes

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 quitter 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é:

  1. Quitter l' stdafx.h comme c'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.
  2. L'utilisation de l'approche à partir d' ici - faire stdafx.h ressemblent (set USE_PRECOMPILED_HEADER pour VS uniquement):

    #ifdef USE_PRECOMPILED_HEADER
    ... my stuff
    #endif 
    
  3. Utiliser l'approche à partir d' ici - compiler VC++ avec /FI pour implicitement comprennent stdafx.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ésordre stdafx.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 pas d' stdafx.h, tout en étant capable de tourner sur les en-têtes précompilés sur VS en /FI seulement.

  4. 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?

48voto

Brian R. Bondy Points 141769

Vous êtes mieux de l'aide d'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 jointe à l' .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é pour les appelés stdafx.h.gch tout moment vous incluez stdafx.h

Exemple:

stdafx.h:

#include <string>
#include <stdio.h>

a.cpp:

#include "stdafx.h"
int main(int argc, char**argv)
{
  std::string s = "Hi";
  return 0;
}

Puis compilez comme:

> g++ -c stdafx.h -o stdafx.h.gch
> g++ a.cpp
> ./a.out

Votre compilation fonctionne même si vous supprimez stdafx.h après l'étape 1.

3voto

Lucas Points 13318

J'ai utilisé l'option 3, la dernière fois j'avais besoin de faire cette même chose. Mon projet était assez petite, mais cela a fonctionné à merveille.

2voto

Timo Geusch Points 16952

Je voudrais 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 cela.

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.

1voto

Quandary Points 12867

C'est simple, vraiment:

Projet>Réglages Du Projet (Alt + F7)

Projet-Paramètres-Dialogue:
C++ -> Catégorie: les en-Têtes Précompilés -> en-Têtes Précompilés boutons radio --> désactiver

1voto

Jeff Points 115

Depuis stdafx.h est, par défaut, toutes les Fenêtres spécifique des choses, j'ai mis un vide stdafx.h sur mon autre plate-forme. De cette façon, votre code source reste identique, tout en désactivant stdafx sur Linux, sans avoir à retirer tout l' #include "stdafx.h" des lignes à partir de votre code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X