¿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.
¿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.
Respuestas:
Definitivamente he tenido éxito. Primero, utilicé el siguiente código:
#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;
}
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:
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
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
-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:
#include <string>
#include <stdio.h>
a.cpp:
#include "stdafx.h"
int main(int argc, char**argv)
{
std::string s = "Hi";
return 0;
}
Luego compila como:
> g++ -c stdafx.h -o stdafx.h.gch
> g++ a.cpp
> ./a.out
Su compilación funcionará incluso si elimina stdafx.h después del paso 1.
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
:
// Put your common include files here: Boost, STL as well as your project's headers.
main.cpp
:
#include "pch.h"
// Use the PCH here.
Genere el PCH así:
$ g++ -x c++-header -o pch.h.gch -c pch.h
El pch.h.gch
debe estar en el mismo directorio que pch.h
para poder ser utilizado, así que asegúrese de ejecutar el comando anterior desde el directorio donde pch.h
está.
-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.
Llame a gcc de la misma manera que lo llama para su archivo fuente pero con un archivo de encabezado.
p.ej
g++ $(CPPFLAGS) test.h
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
Asegurate que -include your_header.h
Así es como precompilé y usé la bits/stdc++.h
colección.
Código
#include <bits/stdc++.h>
Luego localicé la biblioteca compilando mi archivo con -H y mirando la salida
g++ sol.cpp -H -O3 -pthread -lm -std=c++14 -o executable
donde vi
. /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h
Así que hice un nuevo directorio bits
dentro del actual y lo copié stdc++.h
desde allí.
Entonces corrí
g++ bits/stdc++.h -O3 -std=c++14 -pthread
que generó bits/stdc++.gch
Normalmente compilé mi código a través de
g++ sol.cpp -O3 -pthread -lm -std=c++14 -o executable
, pero tuve que modificar eso para
g++ sol.cpp -include bits/stdc++.h -O3 -pthread -lm -std=c++14 -o executable
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
time g++ sol.cpp ...
o corre
g++ sol.cpp -H -O3 -pthread -lm -std=c++14 -o executable
nuevamente y busque rutas de encabezado y si ahora obtiene !
antes de la ruta de la biblioteca, por ejemplo
! ./bits/stdc++.h.gch
....