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


116

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

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

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

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

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

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


13
gcc создаст их, если вы случайно скажете ему скомпилировать файл .h. Не делайте этого :) (если только вы не хотите создать предварительно скомпилированный заголовок)
jalf

3
Вне GCC мира, .gch файлы называются .PCH .
Patapoom

Ответы:


115

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

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

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

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


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

38

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

file filename

file a.h.gch дает:

GCC precompiled header (version 013) for C

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 нарушено, в какой-то момент возникнет проблема, описанная в вопросе. Если правило два нарушается, в какой-то момент компоновщик будет жаловаться на многозначные символы.


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

В вашем правиле 2 мы # включаем файлы .cpp, если они имеют определение функции шаблона
NAND
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.