Wie behebt man die beim Erstellen fehlende PCH-Datei?


164

Wenn ich meine C ++ - Lösung in Visual Studio erstelle, wird beanstandet, dass die Datei xxxxx.pch fehlt. Gibt es eine Einstellung, die mir fehlt, um die vorkompilierten Header zurückzubekommen?

Hier ist der genaue Fehler für die Vollständigkeit:

Error   1   fatal error C1083: Cannot open precompiled header file: 'Debug\xxxxx.pch': No such file or directory

1
Sie müssen weitere Informationen bereitstellen. Welchen Fehler bekommen Sie genau? Wie ist Ihr Projekt aktuell konfiguriert?
Assaf Lavie

Nur ein einfacher Umbau hat mein Problem behoben.
Deqing

Antworten:


436

HINWEIS: In späteren Versionen der IDE wird möglicherweise "pch" anstelle von "stdafx" in den Standardnamen für verwandte Dateien verwendet. In den folgenden Anweisungen muss stdafx möglicherweise durch pch ersetzt werden. Ich entschuldige mich. Es ist nicht meine Schuld.

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Ihr Projekt.
  2. Klicken Sie unten im Dropdown-Menü auf Eigenschaften.
  3. Wählen Sie oben links auf den Eigenschaftenseiten im Dropdown-Menü die Option Alle Konfigurationen aus.
  4. Öffnen Sie den C / C ++ - Baum und wählen Sie Vorkompilierte Header
  5. Vorkompilierter Header: Wählen Sie Verwenden (/ Yu)
  6. Füllen Sie das Feld Vorkompilierte Header-Datei aus. Standard ist stdafx.h
  7. Klicken Sie auf Okay

  8. Wenn Sie stdafx.h nicht in Ihren Header-Dateien haben, legen Sie es dort ab. Bearbeiten Sie es, um alle Header einzuschließen, die vorkompiliert werden sollen.

  9. Fügen Sie eine Datei mit dem Namen stdafx.cpp in Ihr Projekt ein. Setzen Sie #include "stdafx.h" oben drauf und sonst nichts.
  10. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf stdafx.cpp. Wählen Sie erneut Eigenschaften und Alle Konfigurationen wie in Schritt 4 ...
  11. ... aber diesmal wählen Sie Precompiled Header Create (/ Yc). Dies wird nur an die eine Datei stdafx.cpp gebunden.
  12. Fügen Sie #include "stdafx.h" ganz oben in alle Ihre Quelldateien ein.

Lucky 13. Drücken Sie die Daumen und drücken Sie Build.


58
Ich wusste nicht, dass stdafx.cpp eine andere Einstellung haben sollte. Gute Antwort.
Experte

5
Dies sollte die akzeptierte Antwort sein, da der anderen die Schritte 10 und 11 fehlen. Danke!
JBentley

2
Dies ist eine grundlegendere Antwort als meine. Die Schritte 1 bis 7 sind erforderlich, damit PCH funktioniert. Die Fehlermeldung in der Frage zeigt jedoch an, dass diese Schritte bereits ausgeführt wurden. OTOH geht von einer einzelnen stdafx.pchDatei aus, während die xxxxx.pchFrage auf ein komplexeres Problem hinweist (Multi-PCH-Setup).
MSalters

1
Diese Antwort hat den Tag wirklich gerettet. Vielen Dank.
Matt Craig

Danke mein Herr! Zurück zu meinen C / C ++ - Wurzeln für ein neues Projekt und ich fühle mich wie ein bisschen spaz
Colby Africa

59

Die Verwendung von vorkompilierten Headern (pch) erfolgt in zwei Schritten.

In Schritt eins kompilieren Sie eine Stub-Datei (in VS200x wird sie normalerweise aufgerufen stdafx.cpp. Neuere Versionen verwenden pch.cpp.). Diese Stub-Datei enthält indirekt nur die Header, die Sie vorkompilieren möchten. In der Regel listet ein kleiner Header (normalerweise stdafx.hoder pch.hpp) Standardheader wie <iostream>und auf <string>, die dann in der Stub-Datei enthalten sind. Durch das Kompilieren wird die .pch-Datei erstellt.

In Schritt 2 enthält Ihr tatsächlicher Quellcode denselben kleinen Header aus Schritt 1 wie der erste Header. Wenn der Compiler auf diesen speziellen Header stößt, liest er stattdessen die entsprechende .pch-Datei. Das bedeutet, dass diese Standardheader nicht jedes Mal (neu) kompiliert werden müssen.

In Ihrem Fall scheint Schritt 1 fehlgeschlagen zu sein. Ist die Stub-Datei noch vorhanden? In Ihrem Fall wäre das wahrscheinlich xxxxx.cpp. Es muss sich um eine Datei handeln, mit der kompiliert wurde /Yc:xxxxx.pch, da dies das Compiler-Flag ist, das angibt, dass es sich um Schritt 1 des PCH-Prozesses handelt. Wenn xxxxx.cppvorhanden und eine solche Stub-Datei ist, fehlt wahrscheinlich die /Yc:Compiler-Option.


13
dann fehlt wahrscheinlich die Option / Yc: compiler. Übrigens befindet sich die Option in Projekteigenschaftsseiten / Konfigurationseigenschaften / C-C ++ / Vorkompilierte Header
Wip

22

Fix:

  1. Stellen Sie sicher, dass Sie xxxxx.cpp in Ihrem Projekt haben

  2. Kompilieren Sie xxxxx.cpp mit dem Flag / Yc ( Create Precompiled Header)
    (Rechtsklick auf xxxxx.cpp -> Eigenschaften -> Precompiled Headers -> create )

  3. Kompilieren Sie alle anderen Dateien mit / Yu - Flag ( Verwenden vorkompilierte Header)
    (Rechtsklick auf Projekt -> Eigenschaften -> vorkompilierte Header -> Verwendung )


Das hat mich repariert. Vielen Dank!
CharlesW

7
  1. Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie den Menüpunkt Eigenschaft
  2. gehe zu C / C ++ -> Vorkompilierte Header
  3. Wählen Sie Nicht vorkompilierte Header verwenden

Das hat bei mir funktioniert. Ich hatte "stdafx.cpp" gelöscht. Als ich es wieder hinzufügte, verschwand dieser Fehler erst, wenn ich vorkompilierte Header ausschaltete. Das Projekt ist sowieso winzig, es ist also nicht so, als ob es einen großen Unterschied in der Geschwindigkeit macht.
Contango

3
4. Wählen SieCreate (/Yc) (um wiederherzustellen und dann wieder zu verwenden)
Bitterblue

2

Ja, es kann mit den / Yc-Optionen beseitigt werden, wie andere bereits betont haben, aber höchstwahrscheinlich müssten Sie es nicht berühren, um es zu beheben. Warum wird dieser Fehler überhaupt angezeigt, ohne dass Einstellungen geändert werden? Möglicherweise haben Sie das Projekt "bereinigt" und dann versucht, eine einzelne CPP-Datei zu kompilieren. In diesem Fall wird dieser Fehler angezeigt, da der Precompiler-Header jetzt fehlt. Erstellen Sie einfach das gesamte Projekt (auch wenn es nicht erfolgreich ist) und erstellen Sie dann eine einzelne CPP-Datei, und Sie erhalten diesen Fehler nicht.


2

Falls Ihnen dies auf einem Server-Build (AppCenter) passiert und Sie CocoaPods verwenden, stellen Sie sicher, dass Ihre Pod-Datei eingecheckt ist.

AppCenter führt den Befehl "pod install" nur aus, wenn ein Pofile gefunden wird und der PODS-Ordner in den Dateien NICHT gefunden wird.

Ich hatte den Ordner eingecheckt, aber da git .pch-Dateien automatisch ignoriert (überprüfen Sie .gitignore, um dies zu bestätigen), wurde meine .pch nicht eingecheckt.

Ich habe mein Problem behoben, indem ich die .pch-Dateien gezwungen habe, es zu überprüfen, aber das Löschen des PODS-Ordners sollte auch funktionieren, da Appcenter in diesem Fall den Befehl pod install ausführt.

Hoffentlich hilft das jemandem.


0

Wenn alles in Ordnung ist, aber dieser Fehler vorliegt, muss der nächste Abschnitt in der Datei ****. Vcxproj überprüft werden:

<ClCompile Include="stdafx.cpp">
  <PrecompiledHeader Condition=

In meinem Fall gab es einen falschen Namen für eine Konfiguration: nur das erste Wort.


0

Ich weiß, dass dieses Thema sehr alt ist, aber ich habe mich kürzlich in VS2015 damit befasst. Es hat geholfen, die Build-Ordner zu löschen und neu zu erstellen. Dies kann durch den Versuch geschehen sein, das Programm zu schließen, oder durch ein Programm, das VS während der Erstellung anhält / einfriert.


Ja, aber die ursprüngliche Frage hatte mit VS2008 zu tun, nicht mit VS2015. Haben Sie eine Gewissheit, dass dies das Problem des OP lösen würde?
T-Heron

Unabhängig davon, um welche VS-Version es sich handelt, tritt das Problem immer noch in verschiedenen Builds auf. Versuchen Sie das einfach und sehen Sie, ob es für alles funktioniert, mit dem Sie es zu tun haben.
Glover12

0

Ich habe nach der iOS-PCH-Datei gesucht, die das gleiche Problem hat. Wenn Sie wie ich hierher gekommen sind, habe ich die Lösung gefunden, indem ich abgeleitete Daten gelöscht habe. Schließen Sie Simulator (en), gehen Sie zu xCode-Einstellungen -> Speicherorte -> gehen Sie zum Pfad der abgeleiteten Datendatei, schließen Sie xCode, löschen Sie die Dateien im Ordner für abgeleitete Daten, starten Sie neu und jubeln Sie :)


-1

Versuchen Sie Build> Clean Solution und dann Build> Build Solution. Das funktioniert bei mir.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.