Как сгенерировать .pch для большого количества заголовков?

В моем коде постоянно используются libcxx, sdl и некоторые другие библиотеки. Как я могу сгенерировать .pch с учетом того, что каждый заголовок может включать некоторые другие заголовки (даже со сложными условиями, такими как #ifdef #include #endif. Вот почему трудно понять список необходимых файлов заголовков. Должен ли я просто использовать только все файлы заголовков, найденные в какие папки для создания .pch? Как насчет использования такой производительности .pch в таком случае?

ОБНОВЛЕНИЕ: если это имеет значение, я собираюсь использовать его с Clang (не GCC), а точнее через Clang C. API. ОБНОВЛЕНИЕ2:

я создал pch для файла с одним заголовком:

MBA-Anton:pch asmirnov$ clang++ -x c++-header header.h -emit-pch -o header.pch
MBA-Anton:pch asmirnov$ clang++ -include-pch header.pch source.cpp -o source -x c++

но мне не удалось сгенерировать pch для нескольких файлов:

MBA-Anton:pch asmirnov$ clang++ -x c++-header header.h header2.h -emit-pch -o headers.pch
clang: error: cannot specify -o when generating multiple output files

person 4ntoine    schedule 04.11.2014    source источник
comment
Я думаю, что где-то читал, что gcc STL каким-то образом предварительно скомпилирован. Кто-нибудь может это подтвердить?   -  person alfC    schedule 04.11.2014


Ответы (2)


Компилятор GCC хорошо работает только с одним включенным предварительно скомпилированным заголовком, , как описано в этом ответе. Поэтому, если вы хотите использовать PCH в GCC, вам понадобится один файл заголовка для всех единиц перевода ваших приложений (и каждая из них должна точно начинаться с этой единственной #include директивы).

Думаю, такая ситуация также полезна для других компиляторов, поддерживающих некоторые предварительно скомпилированные заголовки.

В будущих версиях (публикация C ++ 14) стандарта C ++ может быть определен модульный механизм. См., Например, Предложение n4047.

Обратите внимание, что предварительно скомпилированные заголовки очень зависят от компилятора (с GCC они могут даже не работать при обновлении с GCC 4.9.1 до GCC 4.9.2), поэтому вам не следует слишком сильно зависеть от них.

person Basile Starynkevitch    schedule 04.11.2014
comment
спасибо за информацию о gcc. на самом деле мне пришлось добавить, что мне это нужно для clang, но я не знал, что это важно - person 4ntoine; 04.11.2014
comment
как я читал здесь (clang.llvm.org/docs/PCHInternals.html) clang's pchs обычно генерируются для пакета заголовков. - person 4ntoine; 04.11.2014

Во-первых, я не использовал pch с gcc только с компилятором microsoft.

Условия #ifdef и т. Д. Решаются перед компиляцией, поэтому, если вы измените переменную препроцессора, файл PCH все равно будет скомпилирован. Так что просто добавьте все файлы из библиотеки, которые вам нужны.

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

Не беспокойтесь о многократном включении заголовков в ваш pch-файл. Поскольку этот файл не будет компилироваться очень часто, вы можете игнорировать здесь большое время компиляции.

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

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

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

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

Это потому, что инкрементная компиляция работает очень хорошо, а инкрементная компоновка - нет.

Вот краткая, но полезная компиляция того, что можно и чего нельзя делать в отношении прямого объявления: http://www.chromium.org/developers/coding-style/cpp-dos-and-donts

person Denis    schedule 04.11.2014
comment
Основная цель использования .pch в моем случае - сокращение времени компиляции / компоновки, поскольку список заголовков всегда один и тот же. Я не беспокоюсь о том, чтобы включать некоторые заголовки несколько раз, но беспокоюсь о добавлении ненужных заголовков в файл pch. Это вопрос. - person 4ntoine; 04.11.2014