【问题标题】:Why is Visual Studio 2012 running custom build step when source file hasn't been changed?为什么 Visual Studio 2012 在源文件未更改时运行自定义构建步骤?
【发布时间】:2012-09-14 20:06:25
【问题描述】:

我在 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) 宏。不确定那是什么,或者它是否以某种方式指向正在修改的文件。

【问题讨论】:

  • 删除 %(AdditionalInputs) 宏对问题没有影响。

标签: c visual-studio msbuild dependencies yacc


【解决方案1】:

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

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

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

【讨论】:

  • 您的答案虽然不完全正确,但会导致解决方案。我认为 %(Directory) 是从根目录到项目目录的完整路径,该目录也是构建期间的当前目录。 %(Directory) 指向项目目录,但没有驱动器或前导斜杠“ICL5K\ICL5K\”,这不是很有用,因为它是解决方案父级的相对路径。我想要的是 $(ProjectDir),它是“C:\ICL5K\ICL5K\”。虽然我发现一个更简单的解决方案是删除所有 %(Directory) 宏,因为所有文件都在项目目录中并且已经是当前目录。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-02-22
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多