Alguém teve algum sucesso em conseguir cabeçalhos pré-compilados trabalhando com o GCC? Não tive sorte em minhas tentativas e não vi muitos bons exemplos de como configurá-lo. Eu tentei no cygwin gcc 3.4.4 e usando 4.0 no Ubuntu.
Alguém teve algum sucesso em conseguir cabeçalhos pré-compilados trabalhando com o GCC? Não tive sorte em minhas tentativas e não vi muitos bons exemplos de como configurá-lo. Eu tentei no cygwin gcc 3.4.4 e usando 4.0 no Ubuntu.
Respostas:
Definitivamente tive sucesso. Primeiro, usei o seguinte 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 foi apenas um hello world da Boost Xpressive (veja o link abaixo). Primeiro, compilei com a -H
opção do gcc. Ele mostrou uma lista enorme de cabeçalhos usados. Então, eu dei uma olhada nos sinalizadores de compilação que meu IDE (code :: blocks) estava produzindo e vi algo assim:
g++ -Wall -fexceptions -g -c main.cpp -o obj/Debug/main.o
Então, escrevi um comando para compilar o arquivo Xpressive.hpp com exatamente as mesmas sinalizações:
sudo g++ -Wall -fexceptions -g /usr/local/include/boost/xpressive/xpressive.hpp
Compilei o código original novamente com o -H
e obtive esta saída:
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
O ! significa que o compilador foi capaz de usar o cabeçalho pré-compilado. Um x significa que não foi possível usá-lo. Usar os sinalizadores de compilador apropriados é crucial. Tirei o -H e fiz alguns testes de velocidade. O cabeçalho pré-compilado teve uma melhora de 14 segundos para 11 segundos. Não é ruim, mas não é ótimo.
Observação: aqui está o link para o exemplo: http://www.boost.org/doc/libs/1_43_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.examples Não consegui fazê-lo funcionar no postar.
BTW: estou usando o seguinte g ++
g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3
-Winvalid-pch
para certificar-se de que o cabeçalho pré-compilado está sendo usado corretamente? Notamos uma grande melhoria usando pch para nossas compilações de depuração, então eu me pergunto se há um problema com sua configuração.
Em primeiro lugar, consulte a documentação aqui .
Você compila cabeçalhos como qualquer outro arquivo, mas coloca a saída dentro de um arquivo com o sufixo .gch
.
Então, por exemplo, se você pré-compilar stdafx.h, você terá um cabeçalho pré-compilado que será automaticamente procurado, chamado stdafx.h.gch
sempre que você incluirstdafx.h
Exemplo:
stdafx.h:
#include <string>
#include <stdio.h>
a.cpp:
#include "stdafx.h"
int main(int argc, char**argv)
{
std::string s = "Hi";
return 0;
}
Em seguida, compile como:
> g++ -c stdafx.h -o stdafx.h.gch
> g++ a.cpp
> ./a.out
Sua compilação funcionará mesmo se você remover stdafx.h após a etapa 1.
O -x
especificador para cabeçalhos pré-compilados C ++ é -x c++-header
, não -x c++
. Segue-se um exemplo 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.
Gere o PCH assim:
$ g++ -x c++-header -o pch.h.gch -c pch.h
O pch.h.gch
deve estar no mesmo diretório que o pch.h
para ser usado, portanto, certifique-se de executar o comando acima no diretório onde pch.h
está.
-c pch.h
, não -c pch.cpp
?
Consegui fazer com que cabeçalhos pré-compilados funcionassem sob gcc uma vez no passado, e lembro-me de ter tido problemas também. A coisa a lembrar é que o gcc irá ignorar o arquivo (header.h.gch ou similar) se certas condições não forem atendidas, uma lista das quais pode ser encontrada na página de documentação do cabeçalho pré-compilado do gcc .
Geralmente, é mais seguro fazer com que seu sistema de compilação compile o arquivo .gch como uma primeira etapa, com as mesmas opções de linha de comando e executáveis do resto de sua fonte. Isso garante que o arquivo esteja atualizado e que não haja diferenças sutis.
Provavelmente também é uma boa ideia fazê-lo funcionar com um exemplo inventado primeiro, apenas para remover a possibilidade de que seus problemas sejam específicos ao código-fonte do seu projeto.
Chame o gcc da mesma maneira que o chama para o arquivo de origem, mas com um arquivo de cabeçalho.
por exemplo
g++ $(CPPFLAGS) test.h
isso gera um arquivo chamado test.h.gch
Cada vez que o gcc procura por test.h, ele procura primeiro por test.h.gch e, se o encontrar, o usa automaticamente.
Mais informações podem ser encontradas em Cabeçalhos pré-compilados do GCC
Tenha certeza de -include your_header.h
É assim que eu pré-compilei e usei a bits/stdc++.h
coleção.
Código
#include <bits/stdc++.h>
Então eu localizei a lib compilando meu arquivo com -H e olhando a saída
g++ sol.cpp -H -O3 -pthread -lm -std=c++14 -o executable
onde eu vi
. /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h
Então criei um novo diretório bits
dentro do atual e copiei stdc++.h
de lá.
Então eu corri
g++ bits/stdc++.h -O3 -std=c++14 -pthread
que gerou bits/stdc++.gch
Normalmente eu compilei meu código via
g++ sol.cpp -O3 -pthread -lm -std=c++14 -o executable
, mas eu tive que modificar isso para
g++ sol.cpp -include bits/stdc++.h -O3 -pthread -lm -std=c++14 -o executable
já que só resolveu .gch
arquivar em vez de .h
com -include bits/stdc++.h
Isso foi fundamental para mim. Outra coisa a se manter em mente é que você deve compilar o *.h
arquivo de cabeçalho com quase os mesmos parâmetros que compila o seu *.cpp
. Quando não incluí -O3
ou -pthread
ignorei o *.gch
cabeçalho pré - compilado.
Para verificar se tudo está correto, você pode medir a diferença de tempo comparando o resultado de
time g++ sol.cpp ...
ou correr
g++ sol.cpp -H -O3 -pthread -lm -std=c++14 -o executable
novamente e procure por caminhos de cabeçalho e se agora você obtiver !
antes do caminho da biblioteca, por exemplo
! ./bits/stdc++.h.gch
....