2014-01-14 1 views
8

Ich verwende Visual C++ 2012 mit einem Projekt, das stark vorkompilierte Header verwendet. So schwer, dass der berüchtigte /Zm Switch in Gebrauch ist.Wie mit vorkompilierten Headern umzugehen, die bei einem abgebrochenen Build zufällig beschädigt werden?

Wenn ich einen Build abzubrechen, ich habe manchmal diesen Fehler auf der nächsten Build:

error C1852: 'foo.pch' is not a valid precompiled header file 

Neun von zehn, die Dinge glatt gehen, aber wenn dies geschieht, ich habe das finden. pch und löschen Sie es manuell vor dem Neustart des Builds.

Das ärgert mich ein bisschen. Gibt es eine Möglichkeit, dies zu verhindern? Ein Patch von Microsoft? Oder eine Möglichkeit, Visual zu erzwingen, die .pch zu löschen und den Build automatisch neu zu starten, wenn das Problem auftritt? Oder an eine andere Lösung, an die ich nicht gedacht habe?

EDIT: Hier ist die Version von Visual Ich renne:

Microsoft Visual Studio Professional 2012 
Version 11.0.61030.00 Update 4 
+0

Ich habe das C++ - Tag entfernt, da dies eine Compiler-spezifische Frage und keine Sprachfrage ist. –

+5

@MarkB Ich stimme nicht zu, es gibt wahrscheinlich mehr Leute, die auch mit VC vertraut sind, die das C++ - Tag überwachen als diejenigen, die diese Compiler-spezifischen Tags überwachen. Gerollt zurück zu Rev 1. – Praetorian

+1

Repariert ein Rebuild nicht die PCH-Datei? Wenn ich einen PCH-Fehler bekomme, drücke ich einfach auf Rebuild. –

Antwort

0

Ich folgte rockeyes Vorschlag, ein Muster in diesen beschädigten Dateien zu finden. Es stellt sich heraus, es ist sehr einfach: gültige Dateien beginnen mit einem VCPCH0 Header, beschädigte Dateien nicht.

Ein einfaches C# -Programm, das als Pre-Build-Ereignis des fehlgeschlagenen Projekts ausgeführt wird, und das Löschen der beschädigten Dateien löst das Problem. Wenn jemand interessiert ist, ist die Quelle right here.

1

Dies ist eine reine Vermutung, da ich nicht in dieser Ausgabe lief.

Versuchen Sie herauszufinden, wie Visual erkennen eine .pch-Datei beschädigt ist (d. H. Leere Datei, Datei nicht korrekt beendet, ...). Wenn es einem klaren Muster folgt, schreibe ein Pre-Build-Skript, das alle .pch-Dateien analysiert und beschädigte Dateien löscht.

+0

Er sagte schon, dass es kein Muster gab, denke ich –

+0

Nein nein, es könnte ein Muster sein, vielleicht ist die Datei doch einfach leer oder doch hat eine verdächtig kleine Größe. Ich werde das untersuchen. Gute Idee! –

1

Ich würde ein Skript erstellen, das versuchen würde, die Datei zu rekompilieren, aber dieses Mal mit dem PCH, anstatt es zu generieren. I.e. Das erwartete Ergebnis ist die erfolgreiche Kompilierung einer leeren Datei. Wenn dies fehlschlägt, löschen Sie den PCH. Führen Sie dieses Skript jetzt als Vorbereitungsschritt aus.

Es klingt ziemlich teuer, aber es ist sehr zuverlässig. Jedes Problem beim Laden des PCH verursacht seine Regeneration, sogar Compiler-Upgrades. Außerdem befindet sich Ihr PCH jetzt im Dateicache, was bedeutet, dass die tatsächliche Verwendung etwas billiger ist.

Dies könnte als ein NMAKE-Build-Skript mit etwas ungewöhnlichen Regeln implementiert werden.

+0

Das klingt nach einer guten Problemumgehung, wenn ich kein Muster finden kann, ich muss nur sehen, wie teuer das .pch Pre-Checking ist. –

+0

Es kann ziemlich schnell sein, wenn über NMAKE getan, wenn Sie eine kleine .OK-Datei erstellen, wenn die PCH-Datei diesen Test besteht. Solange diese .OK-Datei neuer als der .PCH ist, müssen Sie den .PCH nicht erneut prüfen – MSalters

Verwandte Themen