Qualcuno ha avuto successo nel far funzionare intestazioni precompilate con GCC? Non ho avuto fortuna nei miei tentativi e non ho visto molti buoni esempi su come configurarlo. Ho provato su cygwin gcc 3.4.4 e utilizzando 4.0 su Ubuntu.
Qualcuno ha avuto successo nel far funzionare intestazioni precompilate con GCC? Non ho avuto fortuna nei miei tentativi e non ho visto molti buoni esempi su come configurarlo. Ho provato su cygwin gcc 3.4.4 e utilizzando 4.0 su Ubuntu.
Risposte:
Ho sicuramente avuto successo. Innanzitutto, ho usato il seguente codice:
#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;
}
Questo era solo un ciao mondo da Boost Xpressive (vedi sotto per il link). Per prima cosa, ho compilato con l' -H
opzione in gcc. Mostrava un enorme elenco di intestazioni che utilizzava. Quindi, ho dato un'occhiata ai flag di compilazione che il mio IDE (codice :: blocchi) stava producendo e ho visto qualcosa del genere:
g++ -Wall -fexceptions -g -c main.cpp -o obj/Debug/main.o
Quindi ho scritto un comando per compilare il file Xpressive.hpp con gli stessi identici flag:
sudo g++ -Wall -fexceptions -g /usr/local/include/boost/xpressive/xpressive.hpp
Ho compilato di nuovo il codice originale con -H
e ho ottenuto questo output:
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
Il ! significa che il compilatore è stato in grado di utilizzare l'intestazione precompilata. Una x significa che non è stato in grado di usarlo. L'utilizzo dei flag appropriati del compilatore è fondamentale. Ho tolto la -H e ho eseguito alcuni test di velocità. L'intestazione precompilata ha avuto un miglioramento da 14 secondi a 11 secondi. Non male ma non eccezionale.
Nota: ecco il collegamento all'esempio: http://www.boost.org/doc/libs/1_43_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.examples Non sono riuscito a farlo funzionare in inviare.
BTW: sto usando il seguente g ++
g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3
-Winvalid-pch
per assicurarti che l'intestazione precompilata venga utilizzata correttamente? Notiamo un grande miglioramento usando pch per le nostre build di debug, quindi mi chiedo se ci sia un problema con la tua configurazione.
In primo luogo, vedere la documentazione qui .
Compili le intestazioni proprio come qualsiasi altro file, ma metti l'output all'interno di un file con suffisso .gch
.
Quindi, ad esempio, se precompili stdafx.h avrai un'intestazione precompilata che verrà cercata automaticamente chiamata stdafx.h.gch
ogni volta che includistdafx.h
Esempio:
stdafx.h:
#include <string>
#include <stdio.h>
a.cpp:
#include "stdafx.h"
int main(int argc, char**argv)
{
std::string s = "Hi";
return 0;
}
Quindi compila come:
> g++ -c stdafx.h -o stdafx.h.gch
> g++ a.cpp
> ./a.out
La tua compilation funzionerà anche se rimuovi stdafx.h dopo il passaggio 1.
Lo -x
specificatore per le intestazioni precompilate C ++ è -x c++-header
, non -x c++
. Segue un esempio di utilizzo di 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.
Genera il PCH in questo modo:
$ g++ -x c++-header -o pch.h.gch -c pch.h
Il pch.h.gch
deve essere nella stessa directory pch.h
di per essere utilizzato, quindi assicurati di eseguire il comando precedente dalla directory in cui si pch.h
trova.
-c pch.h
, no -c pch.cpp
?
Sono riuscito a far funzionare le intestazioni precompilate con gcc una volta in passato, e ricordo di aver avuto problemi anche allora. La cosa da ricordare è che gcc ignorerà il file (header.h.gch o simile) se alcune condizioni non sono soddisfatte, un elenco delle quali può essere trovato nella pagina di documentazione dell'intestazione precompilata di gcc .
In genere è più sicuro che il tuo sistema di compilazione compili il file .gch come primo passaggio, con le stesse opzioni della riga di comando ed eseguibile del resto del codice sorgente. Ciò garantisce che il file sia aggiornato e che non vi siano sottili differenze.
Probabilmente è anche una buona idea farlo funzionare prima con un esempio artificioso, solo per rimuovere la possibilità che i tuoi problemi siano specifici del codice sorgente nel tuo progetto.
Chiama gcc nello stesso modo in cui lo chiami per il tuo file sorgente ma con un file di intestazione.
per esempio
g++ $(CPPFLAGS) test.h
questo genera un file chiamato test.h.gch
Ogni volta che gcc cerca test.h cerca prima test.h.gch e se lo trova lo usa automaticamente.
Ulteriori informazioni sono disponibili in Intestazioni precompilate GCC
Assicurati che -include your_header.h
Ecco come ho precompilato e utilizzato la bits/stdc++.h
raccolta.
Codice
#include <bits/stdc++.h>
Quindi ho individuato la libreria compilando il mio file con -H e guardando l'output
g++ sol.cpp -H -O3 -pthread -lm -std=c++14 -o executable
dove ho visto
. /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h
Quindi ho creato una nuova directory bits
all'interno di quella corrente e ho copiato stdc++.h
da lì.
Poi ho corso
g++ bits/stdc++.h -O3 -std=c++14 -pthread
che ha generato bits/stdc++.gch
Normalmente ho compilato il mio codice tramite
g++ sol.cpp -O3 -pthread -lm -std=c++14 -o executable
, ma ho dovuto modificarlo in
g++ sol.cpp -include bits/stdc++.h -O3 -pthread -lm -std=c++14 -o executable
poiché ha risolto solo il .gch
file invece che .h
con -include bits/stdc++.h
Quella era la chiave per me. Un'altra cosa da tenere a mente è che devi compilare il *.h
file di intestazione con quasi gli stessi parametri con cui compili il tuo *.cpp
. Quando non ho incluso -O3
o -pthread
ignorato l' *.gch
intestazione precompilata.
Per verificare se tutto è corretto, puoi misurare la differenza di orario confrontando il risultato di
time g++ sol.cpp ...
o corri
g++ sol.cpp -H -O3 -pthread -lm -std=c++14 -o executable
di nuovo e cerca i percorsi di intestazione e se ora ottieni !
prima del percorso della libreria, ad esempio
! ./bits/stdc++.h.gch
....