¿Alguien ha tenido éxito al conseguir que los encabezados precompilados funcionen con GCC? No he tenido suerte en mis intentos y no he visto muchos buenos ejemplos de cómo configurarlo. Probé cygwin gcc 3.4.4 y usé 4.0 en Ubuntu.
c++
gcc
precompiled-headers
Lee Baldwin
fuente
fuente
Respuestas:
Definitivamente he tenido éxito. Primero, utilicé el siguiente código:
Este fue solo un saludo a todo el mundo de Boost Xpressive (ver el enlace a continuación). Primero, compilé con el
-H
opción en gcc. Mostró una enorme lista de encabezados que utilizó. Luego, eché un vistazo a las banderas de compilación que estaba produciendo mi IDE (código :: bloques) y vi algo como esto:g++ -Wall -fexceptions -g -c main.cpp -o obj/Debug/main.o
Así que escribí un comando para compilar el archivo Xpressive.hpp con exactamente las mismas banderas:
sudo g++ -Wall -fexceptions -g /usr/local/include/boost/xpressive/xpressive.hpp
Volví a compilar el código original con el
-H
y obtuve este resultado:Los ! significa que el compilador pudo usar el encabezado precompilado. Una x significa que no pudo usarlo. El uso de las banderas del compilador adecuadas es crucial. Me quité la -H y realicé algunas pruebas de velocidad. El encabezado precompilado tuvo una mejora de 14 segundos a 11 segundos. No esta mal, pero tampoco grandioso.
Nota: Aquí está el enlace al ejemplo: http://www.boost.org/doc/libs/1_43_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.examples No pude hacer que funcione en el enviar.
Por cierto: estoy usando el siguiente g ++
g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3
fuente
-Winvalid-pch
para asegurarse de que el encabezado precompilado se esté usando correctamente? Notamos una gran mejora al usar pch para nuestras compilaciones de depuración, así que me pregunto si hay algún problema con su configuración.En primer lugar, consulte la documentación aquí .
Compila encabezados como cualquier otro archivo, pero coloca la salida dentro de un archivo con un sufijo
.gch
.Entonces, por ejemplo, si precompila stdafx.h, tendrá un encabezado precompilado que se buscará automáticamente en
stdafx.h.gch
cualquier momento que incluyastdafx.h
Ejemplo:
stdafx.h:
a.cpp:
Luego compila como:
Su compilación funcionará incluso si elimina stdafx.h después del paso 1.
fuente
El
-x
especificador para los encabezados precompilados de C ++ es-x c++-header
, no-x c++
. A continuación, se muestra un ejemplo de uso de PCH.pch.h
:main.cpp
:Genere el PCH así:
El
pch.h.gch
debe estar en el mismo directorio quepch.h
para poder ser utilizado, así que asegúrese de ejecutar el comando anterior desde el directorio dondepch.h
está.fuente
-c pch.h
,-c pch.cpp
¿ no ?He logrado que los encabezados precompilados funcionen bajo gcc una vez en el pasado, y recuerdo que también tuve problemas en ese momento. Lo que hay que recordar es que gcc ignorará el archivo (header.h.gch o similar) si no se cumplen ciertas condiciones, una lista de las cuales se puede encontrar en la página de documentación del encabezado precompilado de gcc .
En general, es más seguro que su sistema de compilación compile el archivo .gch como primer paso, con las mismas opciones de línea de comando y ejecutable que el resto de su fuente. Esto asegura que el archivo esté actualizado y que no haya diferencias sutiles.
Probablemente también sea una buena idea hacer que funcione primero con un ejemplo artificial, solo para eliminar la posibilidad de que sus problemas sean específicos del código fuente de su proyecto.
fuente
Llame a gcc de la misma manera que lo llama para su archivo fuente pero con un archivo de encabezado.
p.ej
esto genera un archivo llamado test.h.gch
Cada vez que gcc busca test.h busca primero test.h.gch y si lo encuentra lo usa automáticamente.
Puede encontrar más información en Encabezados precompilados de GCC
fuente
Asegurate que
-include your_header.h
Así es como precompilé y usé la
bits/stdc++.h
colección.Código
Luego localicé la biblioteca compilando mi archivo con -H y mirando la salida
donde vi
Así que hice un nuevo directorio
bits
dentro del actual y lo copiéstdc++.h
desde allí.Entonces corrí
que generó
bits/stdc++.gch
Normalmente compilé mi código a través de
, pero tuve que modificar eso para
ya que solo resolvió
.gch
presentar en lugar de.h
con-include bits/stdc++.h
Eso fue clave para mí. Otra cosa a tener en cuenta es que debe compilar el*.h
archivo de encabezado con casi los mismos parámetros que compila su*.cpp
. Cuando no incluí-O3
o-pthread
ignoró el*.gch
encabezado precompilado.Para comprobar si todo está correcto, puede medir la diferencia de tiempo comparando el resultado de
o corre
nuevamente y busque rutas de encabezado y si ahora obtiene
!
antes de la ruta de la biblioteca, por ejemplofuente