Что такое файл .h.gch?

116

Недавно у меня был проект класса, в котором мне нужно было написать программу на G ++.

Я использовал make-файл, и по какой-то причине он иногда оставлял после себя файл .h.gch.

Иногда это не влияло на компиляцию, но время от времени это приводило к тому, что компилятор выдавал ошибку из-за проблемы, которая была исправлена ​​или не имела смысла.

У меня два вопроса:

1) Что такое файл .h.gch и для чего он нужен? и

2) Почему это могло вызвать такие проблемы, если его не очистили?

mnuzzo
источник
13
gcc создаст их, если вы случайно скажете ему скомпилировать файл .h. Не делайте этого :) (если только вы не хотите создать предварительно скомпилированный заголовок)
jalf
3
Вне GCC мира, .gch файлы называются .PCH .
Patapoom

Ответы:

115

.gchФайл предкомпилированный заголовок.

Если a .gchне найден, будут использоваться обычные файлы заголовков.

Однако, если ваш проект настроен на создание предварительно скомпилированных заголовков, он создаст их, если они не существуют, и использует их в следующей сборке.

Иногда он *.h.gchбудет поврежден или содержать устаревшую информацию, поэтому удаление этого файла и его повторная компиляция должны исправить это.

Dunewalker
источник
1
Так почему же размер .gch обычно такой большой?
NAND
38

Если вы хотите узнать о файле, просто введите в терминале

file filename

file a.h.gch дает:

GCC precompiled header (version 013) for C
riteshkasat
источник
2
Мой (OSX, zsh) просто говорит "данные" для .h.gchфайла. Я подозреваю, что для этого вам нужны подходящие файлы базы данных.
Ondrej Slinták
17

а) Это предварительно скомпилированные заголовки: http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html

б) Они содержат "кешированную" информацию из файлов .h и должны обновляться каждый раз, когда вы меняете соответствующий файл .h. Если этого не произошло - в вашем проекте установлены неправильные зависимости.

Александр Тимошенко
источник
15

Другие ответы полностью точны в отношении того, что такое файл gch. Однако контекст (в данном случае новичок, использующий g ++) - это все. В этом контексте есть два правила:

  1. Никогда и никогда не помещайте файл .h в строку компиляции g ++. Только файлы .cpp. Если файл .h компилируется случайно, удалите все файлы * .gch

  2. Никогда и никогда не помещайте файл .cpp в оператор #include.

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

tgibson
источник
2
Для 1-го пункта я буду использовать функцию в качестве примера. Прежде чем программист сможет вызвать myfunc (), он должен описать myfunc () компилятору, используя прототип функции. Если несколько разных файлов .cpp вызывают myfunc (), то прототип должен быть предоставлен в каждом .cpp. При вводе прототипа в каждый файл .cpp возможны ошибки. Поэтому прототип функции помещается в файл .h, который # включается в каждый файл .cpp, в котором вызывается myfunc. Заголовочные файлы содержат только информацию для компилятора, но не исполняемый код. Поэтому бессмысленно помещать файл .h в строку g ++.
tgibson
В вашем правиле 2 мы # включаем файлы .cpp, если они имеют определение функции шаблона
NAND