странное поведение прекомпилированных заголовков gcc с опцией -c - PullRequest
4 голосов
/ 27 марта 2010

Рассказ:

Я не могу заставить правильно скомпилированные заголовки работать с опцией 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. gch вообще).

Что я делаю не так?

1 Ответ

8 голосов
/ 28 марта 2010

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

Вот время:

с пч

$ 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. Эти инструменты сначала обрабатывают исходный код, поэтому эти параметры необходимы.

...