Apa itu file .h.gch?

116

Saya baru-baru ini memiliki proyek kelas di mana saya harus membuat program dengan G ++.

Saya menggunakan makefile dan untuk beberapa alasan terkadang meninggalkan file .h.gch.

Terkadang, hal ini tidak memengaruhi kompilasi, tetapi sering kali hal ini akan mengakibatkan kompiler mengeluarkan kesalahan untuk masalah yang telah diperbaiki atau yang tidak masuk akal.

Saya punya dua pertanyaan:

1) Apa itu file .h.gch dan digunakan untuk apa? dan

2) Mengapa hal itu menyebabkan masalah seperti itu jika tidak dibersihkan?

mnuzzo
sumber
13
gcc membuatnya jika Anda tidak sengaja memintanya untuk mengompilasi file .h. Jangan lakukan itu :) (kecuali jika Anda benar-benar ingin membuat tajuk yang telah dikompilasi)
jalf
3
Di luar GCC dunia, .gch file disebut .pch .
Patapoom

Jawaban:

115

Sebuah .gchfile adalah header dikompilasi.

Jika a .gchtidak ditemukan maka file header normal akan digunakan.

Namun, jika proyek Anda disetel untuk menghasilkan header yang telah dikompilasi sebelumnya, itu akan membuatnya jika tidak ada dan menggunakannya di build berikutnya.

Kadang-kadang *.h.gchakan rusak atau berisi informasi usang, jadi menghapus file itu dan mengompilasinya lagi akan memperbaikinya.

Dunewalker
sumber
1
Jadi kenapa ukuran .gch biasanya begitu besar?
NAND
38

Jika Anda ingin mengetahui tentang sebuah file, cukup ketik di terminal

file filename

file a.h.gch memberikan:

GCC precompiled header (version 013) for C
riteshkasat
sumber
2
Mine (OSX, zsh) hanya mengatakan "data" untuk .h.gchfile. Saya menduga Anda memerlukan file database yang tepat untuk ini.
Ondrej Slinták
17

a) Mereka adalah header yang telah dikompilasi sebelumnya: http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html

b) Mereka berisi informasi "cache" dari file .h dan harus diperbarui setiap kali Anda mengubah file .h masing-masing. Jika itu tidak terjadi - Anda memiliki set dependensi yang salah dalam proyek Anda

Oleksandr Tymoshenko
sumber
15

Jawaban lain sepenuhnya akurat sehubungan dengan apa itu file gch. Namun, konteks (dalam hal ini, pemula yang menggunakan g ++) adalah segalanya. Dalam konteks ini, ada dua aturan:

  1. Jangan pernah meletakkan file .h pada baris kompilasi g ++. Hanya file .cpp. Jika file .h pernah terkompilasi secara tidak sengaja, hapus file * .gch apa pun

  2. Jangan pernah meletakkan file .cpp dalam pernyataan #include.

Jika aturan satu dilanggar, pada titik tertentu masalah yang dijelaskan dalam pertanyaan akan terjadi. Jika aturan dua dilanggar, di beberapa titik linker akan mengeluh tentang simbol yang didefinisikan banyak.

tgibson.dll
sumber
2
Untuk poin pertama saya akan menggunakan fungsi sebagai contoh. Sebelum programmer dapat memanggil myfunc (), programmer harus mendeskripsikan myfunc () ke kompiler menggunakan prototipe fungsi. Jika beberapa file .cpp berbeda memanggil myfunc (), maka prototipe harus disediakan di setiap .cpp. Rawan kesalahan untuk mengetikkan prototipe di setiap file .cpp. Oleh karena itu, prototipe fungsi ditempatkan dalam file .h yang #termasuk dalam setiap file .cpp tempat myfunc dipanggil. File header hanya berisi informasi untuk compiler, bukan kode yang dijalankan. Jadi tidak ada artinya meletakkan file .h pada baris g ++.
tgibson
Dalam aturan 2 Anda, kami # menyertakan file .cpp jika mereka memiliki definisi fungsi template
NAND