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?
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
@Anedar das Problem gelöst. Vielen Dank. Ich denke, du solltest deinen Kommentar als Antwort posten, um den Kredit dafür zu bekommen. – Jona