Предварительно скомпилированные заголовки с GCC - PullRequest
90 голосов
/ 12 сентября 2008

У кого-нибудь был какой-нибудь успех в получении скомпилированных заголовков, работающих с GCC? Мне не повезло в моих попытках, и я не видел много хороших примеров того, как это настроить. Я пробовал на Cygwin GCC 3.4.4 и с помощью 4.0 на Ubuntu.

Ответы [ 5 ]

58 голосов
/ 29 мая 2010

У меня определенно был успех. Сначала я использовал следующий код:


#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;
}

Это был просто привет мир от Boost Xpressive (см. Ссылку ниже). Сначала я скомпилировал с опцией -H в gcc. Он показал огромный список заголовков, которые он использовал. Затем я взглянул на флаги компиляции, которые производила моя IDE (code :: blocks), и увидел что-то вроде этого:

g++ -Wall -fexceptions -g -c main.cpp -o obj/Debug/main.o

Поэтому я написал команду для компиляции файла Xpressive.hpp с точно такими же флагами:

sudo g++ -Wall -fexceptions -g /usr/local/include/boost/xpressive/xpressive.hpp

Я снова скомпилировал исходный код с -H и получил следующий вывод:

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

The! означает, что компилятор смог использовать предварительно скомпилированный заголовок. Символ х означает, что он не мог его использовать. Использование соответствующих флагов компилятора имеет решающее значение. Я снял -H и провел несколько тестов скорости. Предварительно скомпилированный заголовок улучшился с 14 до 11 секунд. Неплохо, но не отлично.

Примечание: вот ссылка на пример: http://www.boost.org/doc/libs/1_43_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.examples Я не смог заставить его работать в посте.

Кстати: я использую следующие g ++

g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3

51 голосов
/ 28 июля 2009

Во-первых, см. Документацию здесь .

Вы компилируете заголовки, как любой другой файл, но вы помещаете вывод в файл с суффиксом .gch.

Так, например, если вы прекомпилируете stdafx.h, у вас будет предварительно скомпилированный заголовок, в котором будет автоматически выполняться поиск по номеру stdafx.h.gch каждый раз, когда вы включаете stdafx.h

Пример:

stdafx.h:

#include <string>
#include <stdio.h>

a.cpp:

#include "stdafx.h"
int main(int argc, char**argv)
{
  std::string s = "Hi";
  return 0;
}

Затем скомпилируйте как:

> g++ -c stdafx.h -o stdafx.h.gch
> g++ a.cpp
> ./a.out

Ваша компиляция будет работать, даже если вы удалите stdafx.h после шага 1.

8 голосов
/ 25 мая 2012

Для генерации pch вместо -x c++ используйте -x c++-header.

pch.h:

<put your common include files here>

pch.cpp:

#include "pch.h"

генерировать PCH:

g++ -x c++-header -o pch.h.gch -c pch.cpp

Файл pch.h.gch должен находиться в том же каталоге, что и файл pch.h!

6 голосов
/ 13 сентября 2008

Вызовите gcc так же, как вы называете его для исходного файла, но с файлом заголовка.

, например

g++ $(CPPFLAGS) test.h

это генерирует файл с именем test.h.gch

Каждый раз, когда gcc ищет файл test.h, он сначала ищет файл test.h.gch и, если он находит его, он использует его автоматически.

Дополнительную информацию можно найти в разделе Скомпилированные заголовки GCC

.
6 голосов
/ 12 сентября 2008

Мне удалось однажды заставить скомпилированные заголовки работать под gcc, и я вспоминаю, что у меня тоже были проблемы. Следует помнить, что gcc будет игнорировать файл (header.h.gch или аналогичный), если не будут выполнены определенные условия, список которых можно найти на странице документации скомпилированного заголовка gcc .

Как правило, наиболее безопасно, чтобы ваша система сборки компилировала файл .gch в качестве первого шага с теми же параметрами командной строки и исполняемым файлом, что и остальная часть вашего исходного кода. Это обеспечивает актуальность файла и отсутствие тонких различий.

Вероятно, это также хорошая идея - сначала поработать с надуманным примером, просто чтобы исключить вероятность того, что ваши проблемы связаны с исходным кодом в вашем проекте.

...