Quelqu'un a-t-il réussi à obtenir des en-têtes précompilés fonctionnant 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 configurer. J'ai essayé cygwin gcc 3.4.4 et en utilisant 4.0 sur Ubuntu.
c++
gcc
precompiled-headers
Lee Baldwin
la source
la source
Réponses:
J'ai certainement eu du succès. Tout d'abord, j'ai utilisé le code suivant:
C'était juste un bonjour le monde de Boost Xpressive (voir ci-dessous pour le lien). Tout d'abord, j'ai compilé avec l'
-H
option dans gcc. Il montrait une énorme liste d'en-têtes qu'il utilisait. Ensuite, j'ai regardé les indicateurs de compilation que mon IDE (code :: blocks) produisait et j'ai 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 fichier Xpressive.hpp avec exactement les mêmes indicateurs:
sudo g++ -Wall -fexceptions -g /usr/local/include/boost/xpressive/xpressive.hpp
J'ai compilé à nouveau le code original avec le
-H
et j'ai obtenu cette sortie: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 indicateurs de compilateur appropriés est cruciale. J'ai enlevé le -H et ai 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.
Remarque: 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 pu le faire fonctionner dans le Publier.
BTW: J'utilise le g ++ suivant
g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3
la source
-Winvalid-pch
pour vous assurer que l'en-tête précompilé est correctement utilisé? Nous remarquons une grande amélioration en utilisant pch pour nos versions de débogage, donc je me demande s'il y a un problème avec votre configuration.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
.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 incluezstdafx.h
Exemple:
stdafx.h:
a.cpp:
Puis compilez comme:
Votre compilation fonctionnera même si vous supprimez stdafx.h après l'étape 1.
la source
Le
-x
spécificateur pour les en-têtes précompilés C ++ est-x c++-header
, not-x c++
. Voici un exemple d'utilisation de PCH.pch.h
:main.cpp
:Générez le PCH comme ceci:
Le
pch.h.gch
doit être dans le même répertoire quepch.h
pour être utilisé, assurez-vous donc d'exécuter la commande ci-dessus à partir du répertoire où sepch.h
trouve.la source
-c pch.h
, non-c pch.cpp
?J'ai réussi à faire fonctionner des en-têtes précompilés sous gcc une fois dans le passé, et je me souviens aussi avoir eu des problèmes à l'époque. La chose à retenir est que gcc ignorera le fichier (header.h.gch ou similaire) si certaines conditions ne sont pas remplies, dont une liste peut être trouvée sur la page de documentation des en-têtes précompilés de gcc .
En règle générale, il est plus sûr que votre système de construction compile 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 votre source. 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 d'abord avec un exemple artificiel, juste pour éliminer la possibilité que vos problèmes soient spécifiques au code source de votre projet.
la source
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
cela génère un fichier appelé test.h.gch
Chaque fois que gcc recherche test.h, il recherche 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
la source
Assurez-vous de
-include your_header.h
C'est ainsi que j'ai précompilé et utilisé la
bits/stdc++.h
collection.Code
Ensuite, j'ai localisé la bibliothèque en compilant mon fichier avec -H et en regardant la sortie
où j'ai vu
J'ai donc créé un nouveau répertoire
bits
dans le répertoire actuel et copié àstdc++.h
partir de là.Puis j'ai couru
qui a généré
bits/stdc++.gch
Normalement, j'ai compilé mon code via
, mais j'ai dû modifier cela pour
car il a seulement résolu de
.gch
déposer au lieu de.h
avec-include bits/stdc++.h
Cela a été la clé pour moi. Une autre chose à garder à l'esprit est que vous devez compiler le*.h
fichier d'en-tête avec presque les mêmes paramètres que vous compilez votre fichier*.cpp
. Quand je n'ai pas inclus-O3
ou-pthread
qu'il a ignoré l'en-*.gch
tête précompilé.Pour vérifier si tout est correct, vous pouvez mesurer le décalage horaire en comparant le résultat de
ou courir
à nouveau et recherchez les chemins d'en-tête et si vous obtenez maintenant le
!
chemin de la bibliothèque, par exemplela source