【问题标题】:Visual Studio 2013 adds EXEC prefix to makefile outputVisual Studio 2013 将 EXEC 前缀添加到 makefile 输出
【发布时间】:2014-12-08 23:31:00
【问题描述】:

如果我使用外部 makefile 在 Visual Studio 2013 中构建解决方案,后者会在输出中遇到的每个错误行中插入前缀“EXEC”,然后再将其放置到输出窗口。结果单击错误行不会导致跳转到源文件,因为 Visual Studio 的另一部分现在将“EXEC”视为文件名的一部分,当然它找不到这样的文件,因为有没有从 'EXEC :' 开始的文件。

您可以轻松地对其进行测试。创建一个makefile项目,在“Build Command Line”类型的项目设置中

echo filename.cpp(76,41) error : 'xxx' was not declared in this scope

然后尝试构建项目。您将在输出窗口中看到:

EXEC : filename.cpp(76,41) error : 'xxx' was not declared in this scope

有没有办法摆脱输出窗口中的“EXEC:”?

【问题讨论】:

  • 在您的第一行 sed 中添加操作命令 s/^EXEC *: *//;
  • 你误会了。输出中没有 EXEC,没有什么可以用 sed 过滤掉。是 Visual Studio 将 EXEC 添加到来自 stdout 或 stderr 的任何内容中。
  • 我已经停止报告有关 VS2013 的错误,因为我不想整天这样做。

标签: c++ visual-studio visual-studio-2013 makefile


【解决方案1】:

注意:这个答案是不正确的 - 我不会在这里删除它(至少目前是这样),因为附加的 cmets 让我得到了我认为是我单独发布的更正确的答案。


您的问题似乎是由命令行中的字符 ':' 引起的。

我不确定为什么该字符会导致 VS 进行一些特殊处理,并且我不确定是否还有其他字符会导致类似的行为。但在你的具体例子中:

echo filename.cpp(76,41) error : 'xxx' was not declared in this scope

如果您删除 ':' 字符:

echo filename.cpp(76,41) error  'xxx' was not declared in this scope

构建输出窗口显示如下:

1>------ Rebuild All started: Project: makefile-project, Configuration: Debug Win32 ------
1>  filename.cpp(76,41) error  'xxx' was not declared in this scope
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

从 VS 的 makefile 项目配置中消除问题字符的一种方法是将命令放入批处理文件或 nmake 文件,并让 VS makefile 项目使用更简单的命令调用批处理/nmake 文件。


更新:

any 包含':' 字符的命令似乎不会出现此问题。例如,以下命令会导致 EXEC 被添加到前面:

echo error :
c:\util\unxutils\usr\local\wbin\echo error :

但以下不是:

echoargs error :
echo :

c:\util\unxutils\usr\local\wbin\echoechoargs.exe 回显其参数的文件)

所以触发器似乎是echo 作为命令和error : 作为参数的组合。我认为可能还有其他触发因素,但任何人的猜测都和我一样好。

【讨论】:

  • OP 说带有 ':' 的行没有问题。
  • @harper:这不是我阅读问题的方式。此外,我在答案中描述的行为是我在 Visual Studio 中看到的。如果':' 在命令行中,则输出窗口中的行前面有一个EXEC;如果从命令中删除了':',则在输出窗口中将非EXEC
  • 是的,它有效。谢谢!现在可以单击错误消息。我发现我也可以在“错误”之前添加一个冒号,它也解决了这个问题。
  • 啊,我明白了。带有一个 ':' 的行没有问题,但另一行带有一个额外的 ':' (可能在错误的位置)。
  • 是的 - 我已经用更多实验的结果更新了答案。触发器似乎非常具体。
【解决方案2】:

我认为我已经获得了一个足够好的想法,即使是不完整的,关于什么是有用的。

正如您在 cmets 中提到的我之前的误导性答案,问题不在于正在使用的命令行 - 这是由于 VS 检查输出并在某些特定情况下添加 EXEC 前缀。

如果输出行包含看起来像"error :""warning :" 的序列 - 输出行中的字段会使 VS 认为输出行是诊断,VS 将在输出行前面加上 @987654324 @ 如果该字段还没有':' 字符之前

例如,以下行将以EXEC :为前缀:

filename error : 

而这个不会:

filename: error :

似乎 VS 想要确保有一个指示诊断的字段,有一个类似于文件名字段的东西(字段由':' 字符分隔。

所以最重要的是,当您创建诊断输出(或将输出重新格式化为与 VS 兼容的格式)时,请确保它至少遵循以下一般格式:

filename : error/warning code : 

后跟看似任意的文本(我不确定后续的 ':' 字符是否重要)。

前两个':' 字符似乎很重要:

  • 文件名字段(带有可选的行和列)后跟':'
  • 诊断代码字段(可以说“错误”或“警告”以及可能的其他标记)后跟':'

【讨论】:

    猜你喜欢
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 2016-05-14
    • 2015-02-12
    • 1970-01-01
    • 2015-05-06
    相关资源
    最近更新 更多