Niedawno miałem projekt klasowy, w którym musiałem stworzyć program z G ++.
Użyłem pliku makefile iz jakiegoś powodu czasami pozostawiał on plik .h.gch.
Czasami nie miało to wpływu na kompilację, ale co jakiś czas powodowało to, że kompilator wyświetlał błąd dotyczący problemu, który został naprawiony lub który nie miał sensu.
Mam dwa pytania:
1) Co to jest plik .h.gch i do czego służy? i
2) Dlaczego miałoby to powodować takie problemy, gdy nie zostało oczyszczone?
Odpowiedzi:
.gch
Plik jest skompilowany nagłówka.Jeśli a
.gch
nie zostanie znalezione, zostaną użyte normalne pliki nagłówkowe.Jeśli jednak projekt jest ustawiony na generowanie wstępnie skompilowanych nagłówków, utworzy je, jeśli nie istnieją, i użyje ich w następnej kompilacji.
Czasami
*.h.gch
plik zostanie uszkodzony lub zawiera nieaktualne informacje, więc usunięcie tego pliku i ponowne skompilowanie powinno to naprawić.źródło
Jeśli chcesz wiedzieć o pliku, po prostu wpisz na terminalu
file a.h.gch
daje:źródło
.h.gch
pliku. Podejrzewam, że potrzebujesz do tego odpowiednich plików bazy danych.Jest to prekompilowany nagłówek GCC.
Wikipedia ma całkiem przyzwoite wyjaśnienie, http://en.wikipedia.org/wiki/Precompiled_header
źródło
a) Są to wstępnie skompilowane nagłówki: http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html
b) Zawierają informacje „z pamięci podręcznej” z plików .h i powinny być aktualizowane za każdym razem, gdy zmieniasz odpowiedni plik .h. Jeśli tak się nie stanie - w swoim projekcie masz ustawione niewłaściwe zależności
źródło
Inne odpowiedzi są całkowicie dokładne w odniesieniu do tego, czym jest plik GCH. Jednak kontekst (w tym przypadku początkujący używający g ++) jest wszystkim. W tym kontekście obowiązują dwie zasady:
Nigdy, przenigdy nie umieszczaj pliku .h w linii kompilacji g ++. Tylko pliki .cpp. Jeśli plik .h zostanie kiedykolwiek skompilowany przypadkowo, usuń wszystkie pliki * .gch
Nigdy, przenigdy nie umieszczaj pliku .cpp w instrukcji #include.
Jeśli zasada pierwsza zostanie złamana, w pewnym momencie pojawi się problem opisany w pytaniu. Jeśli reguła druga zostanie złamana, w pewnym momencie linker będzie narzekał na symbole wielokrotnie definiowane.
źródło