2009-07-08 8 views
3

In einigen meiner VS 2005-Projekte, wenn ich eine Include-Datei ändere, werden einige der cpp-Dateien nicht neu erstellt, obwohl sie eine einfache #include-Zeile enthalten.Woher weiß Visual Studio, welche cpp-Dateien wiederhergestellt werden sollen, wenn eine Include-Datei geändert wird?

Ist das ein bekannter Fehler oder etwas Seltsames an den Projekten? Gibt es irgendwelche Informationen darüber, wie VS die Abhängigkeiten ausarbeitet und kann ich die Dateien dafür anzeigen?

zwischendurch habe ich etwas googeln versucht aber konnte nichts finden. Ich brauche wahrscheinlich den richtigen Suchbegriff ...

Antwort

2

Ich habe dieses Problem von Zeit zu Zeit und mit anderen IDEs, nicht nur VS erlebt. Es scheint, dass ihr interner Abhängigkeitsbaum manchmal mit der Realität überfordert ist. In diesen Fällen habe ich das Löschen von vorkompilierten Headern gefunden (dies ist wichtig), und eine vollständige Neuerstellung löst das Problem immer. Zum Glück passiert es nicht oft.

+0

Yeah komplett Wiederaufbau behebt es, aber dauert etwa 40 Minuten. Ich versuche, unbeaufsichtigte Builds auf meinem Computer laufen zu lassen. – danio

+0

@danio: Ich erinnere mich daran, solche Probleme zu haben. In diesem Fall habe ich entweder Visual Studio neu gestartet oder die Wiederherstellung durchgeführt. Warum musst du alles neu aufbauen? Können Sie das Projekt nicht einfach neu aufbauen? – ovanes

+0

@ovanes Ja Wiederaufbau nur das Problem Projekte ist schneller, aber sie herauszufinden kann zeitaufwendig sein. Ich muss die Linker-Fehler entschlüsseln, um herauszufinden, welche Bibliotheken fehlerhaft sind, jede davon neu erstellen, dann die Lösung neu erstellen und hoffen, dass ich sie alle erwischt habe. – danio

2

Um ehrlich zu sein, habe ich nie ein solches Problem mit Visual Studio konfrontiert. Ihr CPP sollte ebenfalls neu erstellt werden, wenn es die Kopfzeile enthält. Der einzige Grund, warum ich aufkommen kann: Die gleiche Include-Datei stammt aus 2 verschiedenen Quellen.

Sie können versuchen, dies zur Kompilierzeit zu debuggen, indem Sie den Präprozessor aktivieren, um vorverarbeitete Dateien auszugeben. Klicken Sie auf die CPP-Datei, gehen Sie zu Eigenschaften und dann zu C/C++ -> Preprocessor und wählen Sie in "Generate Preprocessed File" den Eintrag mit oder ohne Zeilennummern.

Zum Sie Datei setzen die Pragmas um den neu hinzugekommenen Definitionen wie umfassen:

#pragma starting_definition_X 
... 
#pragma ending_definition_X 

Jetzt ist alles kompilieren. Es wird eine neu erstellte Datei mit demselben Namen wie CPP aber mit der Erweiterung .I (oder .i) sein.

Machen Sie eine Suche, wenn Ihre Pragmas da sind. Wenn nicht, kommt Ihr Include von einem anderen Ort.

Wenn Sie vorkompilierte Header verwenden, sollten Sie cpp neu erstellen. Es gibt auch eine Pragma-Einmal-Anweisung in MS-VC, die die Include-Datei nur einmal analysiert, aber die cpp-Datei sollte trotzdem noch rekompiliert werden.

Hoffnung, dass
Ovanes

+0

Die Header-Dateien verwenden alle #pragma einmal oder #ifdef Wachen, also glaube ich nicht, dass dies die Ursache des Problems ist. Interessant ist aber, dass die Präprozessor-Ausgabe gespeichert werden kann: Danke, dass das in Zukunft nützlich sein könnte ... – danio

+0

Ja, ich habe es oft benutzt, als ich eine Art von gemischten Pre-Prozessor Metaprogrammierung und gewöhnliche Meta-Programmierung gemacht habe. Dies war die einzige Möglichkeit, die Codegenerierung zu debuggen. Das Schöne daran ist, dass Sie beliebige Pragmas in die Header- oder CPP-Datei einfügen und sie später in der vorverarbeiteten Datei finden können, da die vorverarbeiteten Dateien normalerweise sehr groß sind, weil der Compiler große Dateien zuweist und die Einfügungen darin enthalten sind, andernfalls muss die Datei jedes Mal neu schreiben, wenn smt in der Mitte eingefügt wird. Da Pragmas in der pp-Datei bleiben, können Sie einfach nach ihnen suchen und finden Ihr interessantes Snippet. – ovanes

0

Visual Studio vergleicht den Zeitstempel der Dateien hilft. Sie sollten also überprüfen, ob Ihre Systemuhr korrekt eingestellt ist und auch keine der Dateien einen lustigen Zeitstempel enthält. Schauen Sie sich die Include-Dateien, die cpp-Dateien, die pch-Dateien und obj-Dateien an und stellen Sie sicher, dass alle Zeitstempel vernünftig aussehen. Stellen Sie insbesondere sicher, dass keine von ihnen in der Zukunft ist.

+0

danke aber mal gucken ok. .h ist neuer als .obj, das neuer als .cpp ist. Wir benutzen hier kein PCH. – danio

1

Haben Sie die Option "Minimal rebuild" eingeschaltet?

+0

Nein, aber die IDB-Datei scheint immer noch generiert zu werden. Ich werde sehen, ob ich mit diesen Dateien irgendwo hinkommen kann ... – danio

0

Wurden die .h-Dateien im Projekt hinzugefügt? Wenn nicht, dann vs vielleicht nicht in der Lage, die Abhängigkeit zu finden.

+0

Nein, sie sind nicht im Projekt (frag nicht ...). Ich denke nicht, dass das nötig sein sollte. – danio

0

Danke für alle Antworten, die sie geholfen haben, mir in die richtige Richtung zu zeigen.

Ich habe festgestellt, dass das Löschen der IDB-Datei und das erneute Erstellen dann nachfolgende Änderungen von .h-Dateien ermöglichen, damit die richtigen CPP-Dateien erstellt werden. Dies führt jedoch dazu, dass das gesamte Projekt wieder aufgebaut wird, was mich zu Neil Butterworths Vorschlag, einen kompletten Umbau durchzuführen, zurückbringt. Ich glaube nicht, dass ich sonst noch viel tun kann.

Nebenbei, die schlechten und guten IDB-Dateien betrachten kann ich sehen, dass die cpp-Datei, die nicht gebaut wurde nicht in der schlechten IDB ist, während es in der guten IDB ist. Die Header-Datei, die geändert wird, wird mehrmals in beiden Dateien erwähnt.

win_pdbx(download) können die IDB-Datei extrahieren und moyix hat some information über die Ströme in diesen Dateien veröffentlicht. Stream 4 enthält die Dateipfade der cpp-Dateien, aber ich konnte das Format nicht bestimmen.

Verwandte Themen