webentwicklung-frage-antwort-db.com.de

Wie binde ich die Datei stdafx.h aus dem Stammverzeichnis ein?

Mit der Option "Alle Dateien anzeigen" in VS habe ich einen Ordner hinzugefügt und eine neue Klasse in diesem Ordner erstellt. Da ich vorkompilierte Header verwende, muss ich auch die Datei stdafx.h einfügen, die sich relativ zur neuen Klassendatei im Stammverzeichnis befindet.

In meiner CPP-Datei habe ich

#include "..\stdafx.h"

Trotzdem bekomme ich folgenden Fehler:

fehler C1010 : Unerwartetes Dateiende beim Suchen nach vorkompiliertem Header. Haben Sie vergessen, Ihrer Quelle '#include "stdafx.h"' hinzuzufügen?

Mein Verständnis ist, dass das .. den Compiler anweisen soll, eine Verzeichnisebene nach oben zu gehen?

20
Dante

In Visual C++ können Sie verschiedene Möglichkeiten zum Einrichten vorkompilierter Headerdateien definieren. Am häufigsten wird es für ALLE Quelldateien auf der Projektkonfigurationsebene aktiviert. Wählen Sie unter Konfigurationseigenschaften/C++/Vorkompilierte Header die Einstellung "Vorkompilierter Header" und dann "Verwenden". Der gleiche Speicherort mit der Einstellung "Vorkompilierte Header-Datei" ist normalerweise "stdafx.h". Alle Dateien erhalten diese Einstellung (also die Konfiguration am Projekt) AUSSER ....

Eine Datei ist für die Generierung der PCH-Datei verantwortlich. Diese Datei ist normalerweise die Datei stdafx.cpp in Ihrem Projekt und enthält normalerweise nichts außer #include "stdafx.h". Wenn Sie vorkompilierte Header für DIESE DATEI konfigurieren, wechseln Sie von "Verwenden" zu "Erstellen". Dies stellt sicher, dass stdafx.cpp IMMER zuerst kompiliert wird, um die PCH-Datendatei neu zu generieren, wenn der Prime-Header für PCH nicht mehr synchron ist. Es gibt andere Möglichkeiten, die PCH-Einstellungen in Visual Studio zu konfigurieren. Dies ist jedoch die häufigste.

Abgesehen davon ist Ihr Problem definitiv irritierend. Der Dateiname, der zum Starten des PCH-Systems verwendet wird und in den Einstellungen "Verwenden ..." und "Erstellen ..." oben angegeben ist. MUSS DEM TEXT IN IHREM # genau entsprechen. .

Daher ist es sehr wahrscheinlich, dass Sie Ihr Problem beheben können, indem Sie Ihrem Projekt-Include-Verzeichnis ".." hinzufügen und das ".." aus Ihrer # include-Anweisung entfernen. Sie können es auch auf der Projektkonfigurationsebene in "..\stdafx.h" als durchgehenden Header ändern. Dies kann jedoch ein Problem sein, wenn sich Quelldateien in mehreren Ordnern hierarchisch befinden.

Oh, und wenn es Ihnen bei der Durchsicht der PCH-Konfigurationseinstellungen nicht klar war, können Sie PCH für bestimmte Quelldateien deaktivieren, wenn Sie PCH NICHT für bestimmte Quelldateien verwenden möchten (und es gibt Gründe, dies nicht manchmal zu tun). Andernfalls stellen Sie sicher, dass #include "your-pch-include-file.h" am Anfang jeder Quelldatei (c/cpp usw.) steht.

Ich hoffe du machst eine Pause.

16
WhozCraig

Es ist interessant, dass der Trick, den ich benutze, nicht in den Antworten enthalten ist:

  1. Erstellen Sie stdafx.h und stdafx.cpp im Stammverzeichnis des Projekts.
  2. Gehen Sie zu Projekteigenschaften -> Vorkompilierte Header. Ändern Sie auf "Verwenden".
  3. Gehen Sie zu stdafx.cpp, klicken Sie mit der rechten Maustaste auf Eigenschaften -> Vorkompilierte Header. Wechseln Sie zu "Erstellen".
  4. Gehen Sie zu den Projekteigenschaften -> Erweitert; Ändern Sie "Include-Dateien erzwingen" in stdafx.h;% (ForcedIncludeFiles)

Ändern Sie keine CPP-Datei; Behalten Sie Ihre Header-Dateien bei. Bauen wie es ist.

Kein Tippen, kein RSI, kein Ärger mit Include-Pfaden, kein anderer Schmerz und kein anderes Elend. Und das Schöne ist, dass es immer noch funktioniert, wenn Sie Ihre Lösung auf eine andere Plattform verschieben. Genial.

10
atlaste

Im Allgemeinen möchte ich in meinen Projekten auch eine hierarchische Reihenfolge haben, und ich habe festgestellt, dass es zwei einfache Möglichkeiten gibt, einen vorkompilierten Header einzuschließen:

Entweder

  1. Fügen Sie das Verzeichnis, in dem stdafx.h liegt, in die Include-Verzeichnisse des Compilers ein.

    ( Eigenschaften - VC++ - Verzeichnisse - Include-Verzeichnisse : $(ProjectDir) hinzufügen)

Oder

  1. Wenn es nicht zu viele Unterverzeichnisse gibt, kann die Fehlermeldung auf einfache Weise wie folgt umgangen werden:

    • Fügen Sie eine stdafx.h-Datei in jedes Ihrer Unterverzeichnisse ein, die nur den stdafx.h der obersten Ebene enthält:
      #include "..\stdafx.h"
    • Schreiben Sie #include "stdafx.h" als erste Zeile aller Quelldateien in Ihre Unterverzeichnisse, anstatt die Datei der obersten Ebene dort einzuschließen.

Auf diese Weise verwenden alle Ihre Codedateien dieselbe vorkompilierte Headerdatei, und es ist keine weitere komplizierte Einrichtung erforderlich.

8
Felix Dombek

Sie können die vorkompilierten Header-Einstellungen auf Dateibasis anpassen.

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die CPP-Datei und wählen Sie "Eigenschaften".
  2. Es wird dringend empfohlen, "Alle Konfigurationen" im Dropdown-Listenelement "Konfiguration" auszuwählen.
  3. Wechseln Sie zu "C/C++" - "Vorkompilierte Header".
  4. Passen Sie die "Vorkompilierte Header-Datei" von "stdafx.h" an Ihre Anforderungen an (in Ihrem Fall zum Beispiel "../stdafx.h").

Beachten Sie, dass dies mühsam und fehleranfällig ist, da es dateibezogen durchgeführt wird und zukünftige Entwickler, die Ihrem Projekt Dateien hinzufügen, dieselben Schritte ausführen müssen. Wenn nicht, werden sie mit Warnungen und Fehlern konfrontiert, wie zum Beispiel:

  • warning C4627: '#include "<path>"': skipped when looking for precompiled header use.

und

  • fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?

die nicht viel Aufschluss über diesen oder einen anderen Ansatz geben.

Ich denke, sie werden sich irgendwann an StackOverflow wenden und hier landen ... Hallo, danke fürs Lesen.

Auf dieser Basis lohnt es sich, Alternativen zu wählen, beispielsweise $(ProjectDir) in den C++ - Include-Pfad (unter C++\General) einzufügen. Dies kann jedoch zu Verwirrung führen, wenn andere Header-Dateien einbezogen werden.

3
WaffleSouffle

PCH-Dateien sind seltsam und in Visual Studio sogar mehr. Beim Kompilieren einer CPP-Datei, die einen PCH verwendet, erwartet VS, dass der erste Nichtkommentar-/Leerzeichentext #include "PCH_NAME_HERE" ist. Der PCH_NAME_HERE ist genau der Name des PCH. Keine Verzeichnisse, nichts. Nur der Name des PCH, wie in den Compileroptionen angegeben.

Wenn Sie dieses Verzeichnis-Fudging ausführen möchten, müssen Sie Ihre Compiler-Einstellungen so ändern, dass sich das Verzeichnis, in dem sich der PCH befindet, im Verzeichnis-Suchpfad befindet. Auf diese Weise brauchen Sie den Teil ..\ nicht.

2
Nicol Bolas

Ich würde vorschlagen, zu verwenden:

$(ProjectDir)/pch/my_pch.h

als "Vorkompilierte Header-Datei"
und "Erweitert> Include-Datei erzwingen"

Dies schließt automatisch pch für Ihre .cpp-Dateien am Anfang ein, sodass in den .cpp-Dateien nichts geändert werden muss.

Dies ist besser als das Ändern des Include-Verzeichnisses, da manchmal mehrere pch-Dateien in den Include-Verzeichnissen vorhanden sind und Sie dann nicht feststellen können, welche verwendet wurden.

0
Jason

Die Ursache für die Verwirrung ist, dass Visual Studio die include-Direktive, die den vorkompilierten Header enthält, anders als andere include-Direktiven behandelt. Insbesondere wird nicht nach dem vorkompilierten Header mit dem normalen Pfad-Lookup-Ansatz gesucht, sondern lediglich versucht, die include-Direktive durch einfachen Zeichenfolgenvergleich mit der in der Projektkonfiguration definierten zu vergleichen.

Die Konfiguration des Precompiler-Headers wird global festgelegt, kann jedoch pro Datei überschrieben werden. Die normale globale Konfiguration (Zugriff über Projekteigenschaften -> Konfigurationseigenschaften -> C/C++ -> Vorkompilierte Header) lautet:

Precompiled Header: Use (/Yu)
Precompiled Header File: stdafx.h
Precompiled Header Output File: $(IntDir)$(TargetName).pch

Diese Konfiguration wird standardmäßig auf alle Dateien im Projekt angewendet. Die Konfiguration für stdafx.cpp wird jedoch auf Dateiebene festgelegt und überschreibt den Wert des vorkompilierten Headers wie folgt:

Precompiled Header: Create (/Yuc)

Dies hat zur Folge, dass VS für jede Quelldatei, die für die Verwendung des vorkompilierten Headers konfiguriert ist (der standardmäßig alle außer stdafx.cpp enthält), nach einer Include-Anweisung sucht, die dem konfigurierten Wert für die vorkompilierte Headerdatei entspricht. z.B.

#include "stdafx.h"

Da für die Überprüfung ein einfacher Zeichenfolgenvergleich anstelle einer Verzeichnissuche verwendet wird, werden (unabhängig vom Speicherort der Quelldatei im Verhältnis zum Projektstammverzeichnis oder vom Speicherort der Datei stdafx.h) der Pfad und der Dateiname im Include verwendet Die Direktive muss mit genau übereinstimmen, die von der Konfigurationseinstellung der vorkompilierten Headerdatei des Projekts verwendet wird. Der unerwartete Nebeneffekt davon ist, dass Sie in diesen Dateien, wenn Sie ein Projekt-Unterverzeichnis haben, das verschiedene Quelldateien enthält, nicht auf die Datei stdafx.h verweisen müssen, indem Sie einen relativen Pfad wie ..\stdafx.h verwenden (und wenn Sie VS verwenden) wird eine Fehlermeldung auslösen, die besagt, dass beim Suchen nach dem vorkompilierten Header das Dateiende erreicht wurde.

Verwenden Sie einfach das schmucklose #include "stdafx.h" und es funktioniert einwandfrei, da VS dies dann als Anweisung zur Verwendung des vorkompilierten Headers erkennt und bereits weiß, wo der richtige vorkompilierte Header liegt, da die Konfiguration des vorkompilierten Headers stdafx.cpp vorliegt auf "Create (/ Yc)" setzen.

0
Neutrino