85 votes

En-têtes précompilés avec GCC

Quelqu'un a-t-il réussi à obtenir des en-têtes précompilés avec GCC? Je n'ai pas eu de chance dans mes tentatives et je n'ai pas vu beaucoup de bons exemples pour son installation. J'ai essayé sur cygwin gcc 3.4.4 et en utilisant 4.0 sur Ubuntu.

54voto

User1 Points 8352

J'ai vraiment eu du succès. Tout d'abord, j'ai utilisé le code suivant:


#include <boost/xpressive/xpressive.hpp>
#include <iostream>

using namespace std;
using namespace boost::xpressive;

//A simple regex test
int main()
{
    std::string hello( "hello world!" );

    sregex rex = sregex::compile( "(\\w+) (\\w+)!" );
    smatch what;

    if( regex_match( hello, what, rex ) )
    {
        std::cout << what[0] << '\n'; // whole match
        std::cout << what[1] << '\n'; // first capture
        std::cout << what[2] << '\n'; // second capture
    }
    return 0;
}

C'était juste un bonjour à tout le monde de Boost Xpressive (voir ci-dessous pour le lien). Tout d'abord, j'ai compilé avec l' -H option de gcc. Il a montré une énorme liste d'en-têtes qu'il a utilisé. Ensuite, j'ai pris un coup d'oeil à la compilation des drapeaux mon IDE (code::blocks) a la production et a vu quelque chose comme ceci:

g++ -Wall -fexceptions -g -c main.cpp -o obj/Debug/main.o

J'ai donc écrit une commande pour compiler le Xpressive.php fichier avec exactement les mêmes drapeaux:

sudo g++ -Wall -fexceptions -g /usr/local/include/boost/xpressive/xpressive.hpp

J'ai compilé le code d'origine à nouveau avec l' -H et a obtenu ce résultat:

g++ -Wall-fexceptions -H -g -c main.cpp -o obj/Debug/main.o
! /usr/local/include/boost/xpressive/xpressive.hpp.gch
main.cpp
. /usr/include/c++/4.4/iostream
.. /usr/include/c++/4.4/x86_64-linux-gnu/bits/c++config.h
.. /usr/include/c++/4.4/ostream
.. /usr/include/c++/4.4/istream
main.cpp

L' ! signifie que le compilateur a été en mesure d'utiliser l'en-tête précompilé. Un x signifie qu'il n'a pas été en mesure de l'utiliser. Utilisant l'une des options du compilateur est crucial. J'ai pris l'option-H et de couru quelques tests de vitesse. L'en-tête précompilé avait une amélioration de 14 secondes à 11 secondes. Pas mauvais, mais pas génial.

Note: Voici le lien pour l'exemple: http://www.boost.org/doc/libs/1_43_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.examples je ne pouvais pas le faire fonctionner dans le post.

BTW: je suis en utilisant les éléments suivants g++

g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3

49voto

Brian R. Bondy Points 141769

Tout d'abord, voir la documentation ici.

Vous compilez les en-têtes tout comme n'importe quel autre fichier, mais vous mettre la sortie à l'intérieur d'un fichier avec un suffixe .gch.

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;
}

Ensuite compiler:

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

8voto

psaghelyi Points 210

Pour générer le pch au lieu d'utiliser -x c++ utilisez -x c++-header .

pch.h:

 <put your common include files here>
 

pch.cpp:

 #include "pch.h"
 

générer PCH:

 g++ -x c++-header -o pch.h.gch -c pch.cpp
 

Le fichier pch.h.gch doit se trouver dans le même répertoire que le fichier pch.h!

6voto

Paul Points 101

J'ai réussi à obtenir les en-têtes précompilés de travail en vertu de la gcc une fois dans le passé, et je me souviens d'avoir des problèmes ensuite. La chose à retenir est que gcc va ignorer le fichier (en-tête.h.gch ou similaire) si certaines conditions ne sont pas remplies, une liste de ce qui peut être trouvé sur la gcc en-tête précompilé page de documentation.

En général, il est plus sûr d'avoir votre système de construction de la compilation le .gch fichier en tant que première étape, avec les mêmes options de ligne de commande et des fichiers exécutables comme le reste de votre source. Cela garantit que le fichier est à jour et qu'il n'existe pas de différences subtiles.

C'est probablement aussi une bonne idée de le faire fonctionner avec un exemple artificiel d'abord, il suffit de supprimer la possibilité que vos problèmes sont spécifiques à code source de votre projet.

5voto

simon Points 73

Appelez gcc de la même manière que pour votre fichier source, mais avec un fichier d’en-tête.

par exemple

 g++ $(CPPFLAGS) test.h
 

cela génère un fichier appelé test.h.gch

Chaque fois que gcc recherche test.h, il cherche d’abord test.h.gch et s’il le trouve, il l’utilise automatiquement.

Plus d'informations peuvent être trouvées sous GCC Precompiled Headers

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: