95 votes

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

Quelqu'un a-t-il réussi à faire fonctionner 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 sur la façon de le mettre en place. J'ai essayé sur cygwin gcc 3.4.4 et en utilisant 4.0 sur Ubuntu.

0 votes

Je l'ai essayé et j'avais le cas d'utilisation optimal pour les en-têtes précompilés parce que ma source c est générée par le compilateur et non écrite par l'utilisateur. Sun Studio et surtout Visual Studio ont beaucoup amélioré le temps de construction. Avec gcc, c'était encore pire que sans les en-têtes précompilés. C'était avec la version 3.4, je n'ai pas encore testé la version 4.x, mais la vitesse et gcc sont mutuellement exclusives.

0 votes

@Lothar quel était le code ? Je trouve g++ environ 10x plus rapide que les compilateurs récents de Visual Studio, sur du code fortement modélisé.

0 votes

Je n'utilise pas de modèles dans mon code C++. C'est juste du C + la gestion des exceptions + de belles extensions C++. Même maintenant, 6 ans après cette question, VS2010 est une magnitude plus rapide. Mais en attendant, j'ai 16 cœurs et je peux vivre avec.

60voto

User1 Points 8352

J'ai eu beaucoup de succès. 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 hello world de Boost Xpressive (voir ci-dessous pour le lien). D'abord, j'ai compilé avec le -H dans gcc. Il a montré une énorme liste d'en-têtes qu'il utilisait. Ensuite, j'ai regardé les drapeaux de compilation que mon IDE (code::blocks) produisait et j'ai vu quelque chose comme ça :

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

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

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

J'ai de nouveau compilé le code original avec l'option -H et j'ai 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

Le ! signifie que le compilateur a pu utiliser l'en-tête précompilé. Un x signifie qu'il n'a pas pu l'utiliser. L'utilisation des drapeaux de compilation appropriés est cruciale. J'ai enlevé le -H et fait quelques tests de vitesse. L'en-tête précompilé avait une amélioration de 14 secondes à 11 secondes. Pas mal mais pas génial.

Note : Voici le lien vers 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 n'ai pas réussi à le faire fonctionner dans le poste.

BTW : J'utilise le g++ suivant

g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3

23 votes

L'ajout de -Winvalid-pch vous aidera à déboguer si et pourquoi quelque chose ne va pas dans l'utilisation de la PCH.

0 votes

"Les en-têtes précompilés sont utiles lorsque vous avez beaucoup d'en-têtes qui se relient les uns aux autres. Ils réduiront le temps de compilation des très gros projets qui utilisent de grandes ou de nombreuses bibliothèques.

4 votes

"pas mal mais pas génial" : avec gcc 4.4.7, 136 fichiers .cpp d'une taille totale de 35,5 Mo, 148 fichiers .h d'une taille totale de 5,5 Mo, le fichier .gch fait 48 Mo, la compilation de débogage prend 2'20" (contre 2'14" sans débogage), la compilation optimisée -O2 prend 4'30" (contre 5'33" sans débogage). L'effet serait attendu pour la compilation de débogage, mais c'est seulement la compilation optimisée qui bénéficie de la précompilation..... Je ne sais pas pourquoi. La précompilation est bien plus spectaculaire sous Windows !

55voto

Brian R. Bondy Points 141769

Tout d'abord, consultez la documentation ici .

Vous compilez les en-têtes comme n'importe quel autre fichier mais vous placez la sortie dans un fichier avec un suffixe de .gch .

Ainsi, par exemple, si vous précompilez stdafx.h, vous aurez un en-tête précompilé qui sera automatiquement recherché et appelé stdafx.h.gch chaque fois que vous incluez stdafx.h

Ejemplo:

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 compiler comme :

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

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

9voto

Paul Points 101

J'ai réussi à faire fonctionner des en-têtes précompilés sous gcc une fois dans le passé, et je me souviens avoir eu des problèmes à ce moment-là également. Ce qu'il faut retenir, c'est que gcc ignorera le fichier (header.h.gch ou similaire) si certaines conditions ne sont pas remplies, dont la liste peut être trouvée sur le site de l Page de documentation sur les en-têtes précompilés de gcc .

En général, il est plus sûr de demander à votre système de compilation de compiler le fichier .gch dans un premier temps, avec les mêmes options de ligne de commande et le même exécutable que le reste de vos sources. Cela garantit que le fichier est à jour et qu'il n'y a pas de différences subtiles.

C'est probablement aussi une bonne idée de le faire fonctionner avec un exemple artificiel d'abord, juste pour éliminer la possibilité que vos problèmes soient spécifiques au code source de votre projet.

9voto

simon Points 73

Appelez gcc de la même manière que vous l'appelez 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 cherche test.h il cherche d'abord test.h.gch et s'il le trouve il l'utilise automatiquement.

Vous trouverez de plus amples informations sous En-têtes précompilés du GCC

0 votes

J'utilise gcc 3.4 et la ligne g++ stdafx.h ne compile pas, vous obtenez l'erreur "g++ : compilation du fichier d'en-tête demandé", mais ceci compile, je ne suis pas sûr que ce soit ce que je veux : "g++ -c -x c++ stdafx.h -o stdafx.h.pch".

8voto

psaghelyi Points 210

El -x pour les en-têtes précompilés C++ est le suivant -x c++-header pas -x c++ . Voici un exemple d'utilisation de PCH.

pch.h :

// Put your common include files here: Boost, STL as well as your project's headers.

main.cpp :

#include "pch.h"
// Use the PCH here.

Générer le PCH comme ceci :

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

El pch.h.gch doit se trouver dans le même répertoire que le pch.h pour être utilisé, donc assurez-vous que vous exécutez la commande ci-dessus à partir du répertoire où se trouve le fichier pch.h est.

3 votes

Cela devrait être -c pch.h pas -c pch.cpp ?

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