Предварительно скомпилированные заголовки с GCC

Немного похоже на самый первый ответ ...

public static Function<Integer,Double> factorial;

static {
    factorial = n -> {
        assert n >= 0;
        return (n == 0) ? 1.0 : n * factorial.apply(n - 1);
    };
}
90
задан Brian R. Bondy 28 July 2009 в 00:54
поделиться

4 ответа

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

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

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

6
ответ дан Paul 24 November 2019 в 07:06
поделиться

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

, например,

g++ $(CPPFLAGS) test.h

это генерирует файл, названный test.h.gch

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

[еще 116] информация может быть найдена под GCC Предварительно скомпилированные Заголовки

6
ответ дан simon 24 November 2019 в 07:06
поделиться

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

Вы компилируете заголовки так же, как и любой другой файл, но вы помещаете вывод в файл с суффиксом .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.

51
ответ дан 24 November 2019 в 07:06
поделиться

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


#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

I снова скомпилировал исходный код с помощью -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! означает, что компилятор смог использовать предварительно скомпилированный заголовок. Значок x означает, что он не смог его использовать. Использование соответствующих флагов компилятора имеет решающее значение. Я снял -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 I не мог заставить его работать в почте.

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

g ++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3

58
ответ дан 24 November 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: