Miałem problemy z przygotowaniem wstępnie skompilowanych nagłówków, więc wymyśliłem następujący minimalny przykład działania.Dziwne zachowanie z prekompilowanymi nagłówkami gcc
Jest to plik nagłówka foo.h
#include <iostream>
using namespace std;
void hello() {
cout << "Hello World" << endl;
}
skompilować to jako g++ -c foo.h
daje mi skompilowaną nagłówek foo.gch
. Spodziewam się, że kiedy skompiluję następujący plik źródłowy, który zawiera foo.h
, powinien wybrać nagłówek foo.h.gch
i jestem dobry.
// test.cpp
#include <cstdio> // Swap ordering later
#include "foo.h" // ------------------
int main() {
hello();
}
Ale o dziwo, to nie kompiluje używając foo.h.gch
, ale raczej używa foo.h
. Aby zweryfikować można skompilować to jako g++ -H test.cpp
Jednak, jeśli mogę zmienić kolejność włączonych plików nagłówkowych następująco:
// test.cpp
#include "foo.h" // ------------------
#include <cstdio> // Ordering swapped
int main() {
hello();
}
Teraz, jeśli mogę skompilować za pomocą g++ -H test.cpp
, kompiluje z foo.h.gch
, uff!
Tak więc zastanawiałem się, czy jest to błąd w GCC, czy też powinniśmy używać tak skompilowanych nagłówków? W każdym razie myślę, że warto wiedzieć ..
W moim przypadku wydaje się być super skuteczny! Prekompiluję nagłówki CGAL i zmniejszyłem czas kompilacji z około 18 do 2s. – sud03r