6

我在 Visual Studio 2012 C++/CLI 中使用 yacc 和 lex,并为 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

再次建造后

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

我是否误以为使用自定义构建步骤应该在构建步骤的输入和输出文件之间自动应用标准依赖规则?我很好奇的一件事是Studio 在 Additional Dependencies 下为我放入的%(AdditionalInputs)宏。不确定那是什么,或者是否以某种方式指向正在修改的文件。

4

2 回答 2

4

您确定您的输出文件实际上位于您指定的位置吗?

查看您的列表,您列出了输入%(Directory)yyparse.c(这也应该包括 .y 文件)。您的输出不应该也位于%(Directory)icl5kyacc.hand中%(Directory)ICL5KYACC.cpp,看到您的列表似乎表明它们位于同一目录中。

如果找不到输出文件或输出文件比输入文件旧,则构建任务将重新运行。如果您的输出文件路径错误,则该工具将找不到它们并假定构建任务需要再次运行。

于 2012-09-25T09:42:40.993 回答
4

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

于 2012-09-25T17:24:18.833 回答