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


116

Нещодавно у мене був класний проект, де мені довелося скласти програму з G ++.

Я використовував makefile, і він чомусь залишав за собою файл .h.gch.

Іноді це не впливало на компіляцію, але так часто це призвело б до того, що компілятор видав помилку для проблеми, яка була виправлена ​​або не мала сенсу.

У мене є два питання:

1) Що таке .h.gch файл і для чого використовується? і

2) Чому це спричинило б такі проблеми, коли його не прибирали?


13
gcc створює їх, якщо ви випадково скажете йому скласти .h файл. Не робіть цього :) (якщо ви дійсно не хочете створити попередньо
складений

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

b) Вони містять "кешовану" інформацію з .h файлів і повинні оновлюватися щоразу, коли ви змінюєте відповідний .h файл. Якщо цього не відбувається - у вашому проекті встановлені неправильні залежності


15

Інші відповіді є абсолютно точними щодо того, що таке gch-файл. Однак контекст (у даному випадку початківець, який використовує g ++) - це все. У цьому контексті є два правила:

  1. Ніколи і ніколи ніколи не ставив .h-файл у рядок компіляції g ++. Лише .cpp файли. Якщо .h-файл коли-небудь збирається випадково, видаліть будь-які * .gch файли

  2. Ніколи, ніколи, ніколи не ставив .cpp-файл у #include.

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


2
Для першого пункту я буду використовувати приклад як функцію. Перш ніж програміст може викликати myfunc (), програміст повинен описати myfunc () компілятору за допомогою прототипу функції. Якщо кілька різних .cpp-файлів викликають myfunc (), прототип повинен бути наданий у кожному .cpp. Це помилка схильна до набору прототипу у кожному файлі .cpp. Тому прототип функції розміщується у .h-файлі, який #included у кожному .cpp-файлі, де викликається myfunc. Файли заголовків містять інформацію лише для компілятора, а не код, який виконується. Тому безглуздо ставити .h-файл у рядок g ++.
tgibson

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