由于错误条件,跳过构建目标; (' @(ConditionNameHere)' - 不确定如何改变

时间:2014-09-30 01:33:46

标签: c++ visual-studio build-process

初步免责声明:我在Visual Studio中使用C ++的经验有限,所以很好:)

我正在尝试在我的项目中使用Flex / Bison的Windows端口(VS2013),但在跟随教师添加构建自定义(http://sourceforge.net/p/winflexbison/wiki/Visual%20Studio%20custom%20build%20rules/)后,它失败了一个条件而没有执行:< / p>

   Target "BisonTarget" skipped, due to false condition; ('@(Bison)' != '') was evaluated as ('' != '').
   Target "FlexTarget" skipped, due to false condition; ('@(Flex)' != '') was evaluated as ('' != '').

显然这只是基于某些构建/环境变量而失败,但是经过很长一段时间谷歌搜索我无法确定@(NameHere)变量的设置位置,所以我可以强制构建。

有人可以建议我在哪里/如何更改这些变量以启用新构建文件的执行?

2 个答案:

答案 0 :(得分:0)

  1. 确保您的PATH中包含flex.exe和bison.exe(将它们添加到%PATH%)。我在我的PATH=%PATH%;C:\Cola\GnuWin32\bin (修复PATH后,需要重新启动Visual Studio)

  2. 确保自定义构建规则中列出了GNU Tools.targets或(无论文件名)。在Visual Studio中,这是一个全局设置,因此您只需要为所有解析器项目使用一次。如果没有,右键单击项目并选择Build Customization,然后单击Find Existing ...并浏览到.targets文件。

  3. 右键单击您的Bison和Flex源文件(.y / .ypp或.l)并从Item Type中选择适当的文件类型,它应与您刚刚添加的目标相关联。 Item Type的下拉列表中应包含Flex和Bison等值。

  4. 关于('@(Flex)' != '')

    据我所知,这是一个MSBuild条件,它正在评估变量为空。如果它非空,则Condition为true并将执行Target。

    例如,对于上下文,我的.targets文件包含:

      <Target
        Name="_Bison"
        BeforeTargets="$(BisonBeforeTargets)"
        AfterTargets="$(BisonAfterTargets)"
        Condition="'@(Bison)' != ''"
    

答案 1 :(得分:0)

信不信由你,我删除并重新添加.y和.l文件,一切正常。很奇怪,但如果你遇到同样的问题,还有一点需要注意。

图书馆开发人员在https://sourceforge.net/p/winflexbison/discussion/general/thread/18a9d465/?limit=50

建议