6 Stimmen

Warum führt Visual Studio 2012 einen benutzerdefinierten Buildschritt aus, wenn die Quelldatei nicht geändert wurde?

Ich verwende yacc und lex mit Visual Studio 2012 C++/CLI und habe einen benutzerdefinierten Build-Schritt für die yacc-Quelldatei erstellt, wie im Bild unten gezeigt

Custom Build Property Page

Für die Ausgabedatei gibt es zwei Abhängigkeiten. Es handelt sich um die yacc-Quelldatei icl5kyacc.y und die Vorlagendatei yyparse.c. Jedes Mal, wenn ich die Lösung erstelle, wird der benutzerdefinierte Erstellungsschritt ausgeführt, auch wenn die Quelldateien yyparse.c und icl5kyacc.y nicht geändert wurden. Hier ist die Verzeichnisliste nach einem Build.

  21-Sep-2012  10:19:18p         28,210    A icl5kyacc.y
  17-Sep-2012   7:32:06p          9,042    A yyparse.c
  22-Sep-2012  11:43:56a         38,233    A ICL5KYACC.cpp
  22-Sep-2012  11:43:56a          2,160    A icl5kyacc.h

Und nach dem Wiederaufbau

2> Generierung von icl5kyacc.cpp aus icl5kyacc.y

  21-Sep-2012  10:19:18p         28,210    A icl5kyacc.y
  17-Sep-2012   7:32:06p          9,042    A yyparse.c
  22-Sep-2012  11:45:46a         38,233    A ICL5KYACC.cpp
  22-Sep-2012  11:45:46a          2,160    A icl5kyacc.h

Irre ich mich, wenn ich glaube, dass die Verwendung eines benutzerdefinierten Build-Schrittes automatisch Standard-Abhängigkeitsregeln zwischen den Eingabe- und Ausgabedateien des Build-Schrittes anwenden sollte? Eine Sache, auf die ich neugierig bin, ist die %(AdditionalInputs) Makro, das Studio für mich unter Additional Dependencies eingefügt hat. Ich bin mir nicht sicher, was das ist oder ob es irgendwie auf eine Datei verweist, die gerade geändert wird.

4voto

Dervall Punkte 5741

Sind Sie sicher, dass sich Ihre Ausgabedateien tatsächlich an dem von Ihnen angegebenen Ort befinden?

In Ihrer Auflistung finden Sie die Eingabe unter %(Directory)yyparse.c (dies sollte auch die .y-Datei umfassen). Sollte sich Ihre Ausgabe nicht auch in %(Directory)icl5kyacc.h y %(Directory)ICL5KYACC.cpp Da Ihr Eintrag darauf hindeutet, dass sie in dasselbe Verzeichnis gehören.

Der Build-Task wird erneut ausgeführt, wenn er die Ausgabedateien nicht finden kann oder wenn die Ausgabedateien älter sind als die Eingabedateien. Wenn Ihr Pfad zu den Ausgabedateien falsch ist, findet das Tool sie nicht und geht davon aus, dass der Build-Task erneut ausgeführt werden muss.

4voto

JonN Punkte 2418

Das Problem war, dass %(Verzeichnis) ein relativer Pfad vom übergeordneten Verzeichnis der Lösung zum Projektverzeichnis "ICL5K" war. \ICL5K\ " und während des Builds ist das aktuelle Verzeichnis bereits das Projektverzeichnis. Die abhängige yyparse.c wurde also in C:\ICL5K\ICL5K\ICL5K\ICL5K. Ich hätte $(ProjectDir) verwenden sollen, was ein vollständiger Pfad von der Wurzel aus ist, einschließlich des Laufwerksbezeichners " C:\ICL5K\ICL5K\ ". Aber noch besser war es, festzustellen, dass sich alle Eingabe- und Ausgabedateien im Projektverzeichnis befanden und dieses bereits das aktuelle Standardverzeichnis war, und alle Verzeichnismakros wie folgt zu entfernen image here Es ist auch nicht notwendig, icl5kyacc.y als abhängige Datei anzugeben, da der benutzerdefinierte Build-Schritt eine Eigenschaft von icl5kyacc.y ist, so dass diese Datei bereits als abhängige Datei enthalten ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X