Вопрос по precompiled-headers, c++, gcc – странное поведение прекомпилированных заголовков gcc с опцией -c

4

Короткий рассказ:

Я не могу заставить правильно скомпилированные заголовки работать с опцией gcc -c.

Длинная история:

Ребята, я использую gcc-4.4.1 в Linux и, прежде чем пробовать скомпилированные заголовки в очень большом проекте, я решил протестировать их на простой программе. Они "вроде работают", но я не доволен результатами, и я уверен, что что-то не так с моей настройкой.

Прежде всего, я написал простую программу (main.cpp), чтобы проверить, работают ли они вообще:

#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/type_traits.hpp>

int main()
{
  return 0;
}

Затем я создал предварительно скомпилированный файл заголовков pre.h (в том же каталоге) следующим образом:

#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/type_traits.hpp>

... и скомпилировал это:

$ g++ -I. pre.h

(pre.h.gch был создан)

После этого я измерил время компиляции с и без предварительно скомпилированных заголовков:

с ПК

$ time g++ -I. -include pre.h main.cpp

real    0m0.128s
user    0m0.088s
sys  0m0.048s

без ПК

$ time g++ -I. main.cpp 

real    0m0.838s
user    0m0.784s
sys  0m0.056s

Все идет нормально!Почти в 7 раз быстрее, это впечатляет! Теперь давайте попробуем что-нибудь более реалистичное. Все мои исходники построены с опцией -c, и по какой-то причине я не могу заставить pch хорошо с ней работать. Вы можете воспроизвести это с помощью следующих шагов ниже ...

Я создал тестовый модуль foo.cpp следующим образом:

#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/type_traits.hpp>

int whatever()
{
  return 0;
}

Вот время моих попыток собрать модуль foo.cpp с pch и без него:

с ПК

$ time g++ -I. -include pre.h -c foo.cpp 

real    0m0.357s
user    0m0.348s
sys 0m0.012s

без ПК

$ time g++ -I. -c foo.cpp 

real    0m0.330s
user    0m0.292s
sys 0m0.044s

Это довольно странно, похоже, что скорости вообще нет! (Я запускал тайминги несколько раз). Оказалось, что в этом случае прекомпилированные заголовки вообще не использовались, я проверил это с опцией -H (вывод "g ++ -I. -Include pre.h -c foo.cpp -H" не перечислил pre.h. гч вообще).

Что я делаю неправильно?

Ваш Ответ

1   ответ
8

Хорошо, я думаю, что нашел решение:-fpch-предобработки следует использовать вместе с вариант. Отлично работает!

Вот время:

с ПК

$ time g++ -I. -include pre.h -c foo.cpp -fpch-preprocess

real    0m0.028s
user    0m0.016s
sys 0m0.016s

без ПК

$ time g++ -I. -c foo.cpp 

real    0m0.330s
user    0m0.292s
sys 0m0.044s

Обновить: Я задал тот же вопрос в списке рассылки помощи gcc, и Ян Лэнс Тейлор объяснил это странное поведение моим использованием distcc / ccache. Эти инструменты сначала обрабатывают исходный код, поэтому эти параметры необходимы.

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