2016-09-23 4 views
1

Ich versuche, einen vorkompilierten Header zu erstellen und ihn beim Kompilieren einer cpp-Datei zu verwenden. Ich habe die zwei folgenden Dateien:
main.cpp:Vorkompilierter Header wird nicht verwendet, wenn Standardbibliothek hinzugefügt wird

#include "foo.hpp" 

int main() 
{ 
    myTemplate<int> obj; 

    return 0; 
} 

und foo.hpp:

#ifndef FOO_HPP 
#define FOO_HPP 

template<class T> 
class myTemplate 
{ 
}; 

#endif 

ich diesen Befehl ausführen

g++ -std=c++11 foo.hpp 

eine GCH-Datei erstellen Dann mache ich die Objektdatei mit dem -H-Flag, um zu sehen, welche Dateien verwendet werden

g++ -std=c++11 -H -c main.cpp 

und der Ausgang ist

! foo.hpp.gch 
main.cpp 

Gut. Die gch-Datei wird verwendet.

Nun füge ich diese Zeile am Anfang main.cpp

#include <iostream> 

Jetzt, wenn ich versuche nach wie vor die Objektdatei mit dem gleichen Befehl zu erstellen, habe ich eine lange Liste von Dateien zu erhalten (die meisten von ihnen sind natürlich aus der Standardbibliothek), aber keiner von ihnen ist foo.hpp.gch. Ich sehe foo.hpp in der Liste.
Warum macht es einen Unterschied?
Wie kann ich einen vorkompilierten Header beim Erstellen einer Objektdatei verwenden, wenn der Header die Standardbibliothek enthält?

+1

Ich weiß nicht, hot gcc behandelt dies, aber irgendwo im Hinterkopf von MSVC ich erinnere mich, dass vorkompilierte Header in der Regel zuerst in einer Datei platziert werden . Das wäre sinnvoll, weil andere eingeschlossene Header z. Makrodefinitionen, die sich auf Ihren Header auswirken und eine vorkompilierte Version ungültig machen. Also hast du versucht, zuerst "foo.hpp" und dann einzuschließen? – Anedar

+0

@Anedar das Problem gelöst. Vielen Dank. Ich denke, du solltest deinen Kommentar als Antwort posten, um den Kredit dafür zu bekommen. – Jona

Antwort

1

Wie gewünscht, hier mein Kommentar als Antwort:

Fügen Sie die vorkompilierte Header zuerst und dann die Standard-Bibliothek.

Dieses Verhalten ist wahrscheinlich, weil der Compiler nicht wissen kann, ob der nicht vorkompilierte Header (hier die Standardbibliothek) z. einige Makrodefinitionen, die den vorkompilierten Header beeinflussen und ihn ungültig machen. (Vielleicht könnte jemand dies überprüfen, da es nur eine Vermutung ist)

Verwandte Themen