Spec-Zone.ru › GCC 9

3.21 Использование предварительно скомпилированных заголовков

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

Чтобы создать файл предварительно скомпилированного заголовка, просто скомпилируйте его, как любой другой файл, при необходимости используя опцию -x, чтобы заставить драйвер обработать его как файл заголовка C или C++. Возможно, вам потребуется использовать инструмент, такой как make, чтобы поддерживать актуальность предварительно скомпилированного заголовка, когда изменяются заголовки, которые он содержит.

Файл предварительно скомпилированного заголовка ищется, когда #include появляется в компиляции. Когда компилятор ищет включаемый файл (см. Пути поиска в Препроцессоре C), он ищет предварительно скомпилированный заголовок в каждом каталоге, непосредственно перед тем, как искать включаемый файл в этом каталоге. Искомое имя — это имя, указанное в #include с добавленным ‘.gch’. Если файл предварительно скомпилированного заголовка не может быть использован, он игнорируется.

Например, если у вас #include "all.h", и у вас all.h.gch в том же каталоге, что и all.h, то предварительно скомпилированный заголовок используется, если это возможно, а в противном случае используется исходный заголовок.

В качестве альтернативы, вы можете поместить файл предварительно скомпилированного заголовка в каталог и использовать -I, чтобы убедиться, что этот каталог просматривается перед (или вместо) каталогом, содержащим исходный заголовок. Затем, если вы хотите убедиться, что предварительно скомпилированный заголовок всегда используется, вы можете поместить в этот каталог файл с тем же именем, что и исходный заголовок, содержащий команду #error.

Это также работает с -include. Таким образом, ещё один способ использования предварительно скомпилированных заголовков, хороший для проектов, не предназначенных для предварительно скомпилированных заголовков, заключается в том, чтобы взять большинство файлов заголовков, используемых проектом, включить их из другого файла заголовка, предварительно скомпилировать этот файл заголовка и использовать -include для предварительно скомпилированного заголовка. Если файлы заголовков имеют защитные механизмы от многократного включения, они пропускаются, поскольку уже были включены (в предварительно скомпилированный заголовок).

Если вам нужно предварительно скомпилировать один и тот же файл заголовка для разных языков, целей или опций компилятора, можно вместо этого создать каталог с именем, подобным all.h.gch, и поместить каждый предварительно скомпилированный заголовок в этот каталог, возможно, используя -o. Не имеет значения, как вы называете файлы в каталоге; каждый предварительно скомпилированный заголовок в каталоге рассматривается. Первый встреченный предварительно скомпилированный заголовок в каталоге, который подходит для этой компиляции, используется; они просматриваются в произвольном порядке.

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

Файл предварительно скомпилированного заголовка может быть использован только при соблюдении следующих условий:

  • В одной компиляции может использоваться только один предварительно скомпилированный заголовок.
  • Предварительно скомпилированный заголовок не может быть использован после того, как встречен первый токен C. Вы можете иметь директивы препроцессора перед предварительно скомпилированным заголовком; вы не можете включать предварительно скомпилированный заголовок изнутри другого заголовка.
  • Файл предварительно скомпилированного заголовка должен быть сгенерирован для того же языка, что и текущая компиляция. Вы не можете использовать предварительно скомпилированный заголовок C для компиляции C++.
  • Файл предварительно скомпилированного заголовка должен быть сгенерирован тем же бинарным файлом компилятора, что и текущая компиляция.
  • Любые макросы, определённые перед включением предварительно скомпилированного заголовка, должны быть определены так же, как и при генерации предварительно скомпилированного заголовка, или не должны влиять на него, что обычно означает, что они вообще не появляются в предварительно скомпилированном заголовке.

    Опция -D — один из способов определения макроса перед включением предварительно скомпилированного заголовка; использование #define также может это сделать. Есть также некоторые опции, которые неявно определяют макросы, такие как -O и -Wdeprecated; то же правило применяется к макросам, определённым таким образом.

  • Если при использовании предварительно скомпилированного заголовка выводятся отладочные данные (например, с помощью -g), то тот же тип отладочных данных должен был быть выведен при создании предварительно скомпилированного заголовка. Однако предварительно скомпилированный заголовок, созданный с помощью -g, может использоваться в компиляции, когда отладочные данные не выводятся.
  • При создании и использовании предварительно скомпилированного заголовка в целом должны использоваться те же опции -m. См. Опции подмодели для случаев, когда это правило смягчается.
  • Каждая из следующих опций должна быть одинаковой при создании и использовании предварительно скомпилированного заголовка:
    -fexceptions
  • Некоторые другие опции командной строки, начинающиеся с -f, -p или -O, должны быть определены так же, как при создании предварительно скомпилированного заголовка. В настоящее время неясно, какие опции можно изменять, а какие нет; самый безопасный вариант — использовать точно такие же опции при создании и использовании предварительно скомпилированного заголовка. Известно, что следующие опции безопасны:
    -fmessage-length=  -fpreprocessed  -fsched-interblock 
    -fsched-spec  -fsched-spec-load  -fsched-spec-load-dangerous 
    -fsched-verbose=number  -fschedule-insns  -fvisibility= 
    -pedantic-errors

Для всех этих случаев, за исключением последнего, компилятор автоматически игнорирует предварительно скомпилированный заголовок, если условия не соблюдены. Если вы найдёте комбинацию опций, которая не работает и не приводит к игнорированию предварительно скомпилированного заголовка, пожалуйста, рассмотрите возможность отправки отчета об ошибке, см. Отчёты об ошибках.

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

Предыдущий: Переменные окружения, Верхний: Вызов GCC [Оглавление][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.5.0/gcc/Precompiled-Headers.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API