2012-09-22 11 views
5

Sto usando yacc e lex con Visual Studio 2012 C++/CLI e ho creato un passaggio di generazione personalizzata per il file di origine yacc come mostrato nell'immagine qui sottoPerché Visual Studio 2012 esegue il passo di creazione personalizzato quando il file di origine non è stato modificato?

Custom Build Property Page

Ci sono due dipendenze per il file di output . Sono il file sorgente yacc icl5kyacc.y e il file modello yyparse.c. Ogni volta che costruisco la soluzione, il passo di costruzione personalizzato viene eseguito anche quando i file di origine yyparse.c e icl5kyacc.y non sono stati modificati. Ecco l'elenco delle directory dopo una compilazione.

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 

E dopo la costruzione di nuovo

2> Generazione icl5kyacc.cpp da 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 

mi sbaglio nel credere che l'uso di un passaggio di generazione personalizzata dovrebbe applicare automaticamente regole di dipendenza normali tra i file di input e di output della fase di creazione? Una cosa di cui sono curioso è la macro % (AdditionalInputs) che Studio ha inserito per me in Dipendenze aggiuntive. Non sei sicuro di cosa sia o se questo indichi in qualche modo un file che viene modificato.

+0

La rimozione della **% (AdditionalInputs) ** macro non ha avuto alcun effetto sul problema. – JonN

risposta

3

Il problema era che% (Directory) era un percorso relativo dal genitore della soluzione alla directory di progetto "ICL5K \ ICL5K \" e durante la compilazione la directory corrente è già la directory del progetto. Quindi il dipendente yyparse.c veniva cercato in C: \ ICL5K \ ICL5K \ ICL5K \ ICL5K. Avrei dovuto usare $ (ProjectDir) che è un percorso completo dalla radice che include lo specificatore di unità "C: \ ICL5K \ ICL5K \". Ma ancora meglio è stato rendersi conto che tutti i file di input e output erano nella directory del progetto e che era già la directory predefinita corrente e rimuovere tutte le macro di directory come mostrato sotto image here Inoltre non è necessario specificare icl5kyacc.y come dipendente poiché la fase di creazione personalizzata è una proprietà di icl5kyacc.y in modo che il file sia già incluso come dipendente.

3

Sei sicuro che i tuoi file di output siano effettivamente ubicati dove specificato?

Guardando il tuo annuncio hai l'input elencato a %(Directory)yyparse.c (questo dovrebbe includere anche il file .y). Non dovresti trovare l'output anche in %(Directory)icl5kyacc.h e %(Directory)ICL5KYACC.cpp, visto che il tuo annuncio sembra indicare che si trovano nella stessa directory.

L'attività di compilazione verrà riavviata se non è in grado di trovare i file di output o se i file di output sono più vecchi dei file di input. Se il percorso è errato per i file di output, lo strumento non li troverà e supporrà che l'attività di compilazione debba essere eseguita di nuovo.

+0

La risposta non completamente corretta porta alla soluzione. Pensavo che% (Directory) fosse il percorso completo dalla radice alla directory del progetto, che è anche la directory corrente durante la compilazione. % (Directory) punta alla directory del progetto ma senza l'unità o la barra iniziale "ICL5K \ ICL5K \" che non è molto utile poiché si tratta di un percorso relativo dal genitore della soluzione. Quello che volevo era $ (ProjectDir) che è "C: \ ICL5K \ ICL5K \". Anche se ho trovato una soluzione più semplice è stata la rimozione di tutte le macro (Directory) in quanto tutti i file si trovano nella directory del progetto e questa è già la directory corrente. – JonN

Problemi correlati