为什么Visual Studio 2012在源文件未更改时运行自定义构建步骤?

Jon*_*onN 5 c msbuild dependencies yacc visual-studio

我正在使用yacc和lex与Visual Studio 2012 C++/CLI并为yacc源文件创建了一个自定义构建步骤,如下图所示

自定义构建属性页面

输出文件有两个依赖项.它们是yacc源文件icl5kyacc.y和yyparse.c模板文件.每次构建解决方案时,即使尚未修改yyparse.c和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:43:56a         38,233    A ICL5KYACC.cpp
  22-Sep-2012  11:43:56a          2,160    A icl5kyacc.h
Run Code Online (Sandbox Code Playgroud)

再次建造之后

2>从icl5kyacc.y生成icl5kyacc.cpp

  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
Run Code Online (Sandbox Code Playgroud)

我错误地认为使用自定义构建步骤应该在构建步骤的输入和输出文件之间自动应用标准依赖关系规则吗?我很好奇的一件事是Studio(附加依赖项)中为我提供的%(AdditionalInputs)宏.不知道那是什么,或者是否以某种方式指向正在修改的文件.

Jon*_*onN 4

问题在于 %(Directory) 是从解决方案的父级到项目目录“ICL5K\ICL5K\”的相对路径,并且在构建过程中当前目录已经是项目目录。因此,正在 C:\ICL5K\ICL5K\ICL5K\ICL5K 中查找 yyparse.c 依赖项。我应该使用 $(ProjectDir),它是从根开始的完整路径,包括驱动器说明符“C:\ICL5K\ICL5K\”。但更好的是认识到所有输入和输出文件都在项目目录中,并且该目录已经是当前的默认目录,并删除所有目录宏,如下所示 图片在这里 此外,无需将 icl5kyacc.y 指定为依赖项,因为自定义构建步骤是 icl5kyacc.y 的属性,因此该文件已作为依赖项包含在内。