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

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

105 голосов
/ 07 августа 2009

Недавно у меня был проект класса, где я должен был сделать программу на G ++. Я использовал make-файл и по какой-то причине он иногда оставлял файл .h.gch позади. Иногда это не влияло на компиляцию, но время от времени это приводило к тому, что компилятор выдавал ошибку для исправленной или не имеющей смысла проблемы. У меня два вопроса:

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

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

Спасибо за помощь.

Ответы [ 5 ]

104 голосов
/ 07 августа 2009

A .gch - это предварительно скомпилированный заголовок.

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

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

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

33 голосов
/ 21 июля 2013

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

file filename

file a.h.gch дает:

GCC precompiled header (version 013) for C
20 голосов
/ 07 августа 2009

Это предварительно скомпилированный заголовок GCC.

В Википедии есть приличное объяснение, http://en.wikipedia.org/wiki/Precompiled_header

15 голосов
/ 07 августа 2009

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

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

10 голосов
/ 29 сентября 2016

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

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

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

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

...