QtCreator 无法解析 msbuild compile errors/warnings

QtCreator fails to parse msbuild compile errors/warnings

当我尝试使用 QtCreator 3.3.2 构建一个 Visual Studio 2013 项目时,它没有将错误和警告放入 'Issues' 面板。它们在编译输出中可见但不可点击。以下是我通过一个简单示例重现此问题所采取的步骤。

首先我在Visual Studio中做了一个基本的Win32控制台应用程序并在_tmain函数中添加了一行:

int _tmain(int argc, _TCHAR* argv[])
{
   deliberately_missing_function(5);
   std::cout << "Hello world" << std::endl;
    return 0;
}

Visual Studio 报告 deliberately_missing_function 的编译错误,正如预期的那样。

我使用 "Import Existing Project" 模板创建了一个新的 QtCreator 项目,并将其保存在与 Visual Studio 解决方案文件相同的目录中。在项目设置中,我在构建中创建了一个自定义流程步骤,并将命令填充为 C:\Program Files (x86)\MSBuild.0\Bin\MSBuild.exe 并将参数填充为 /p:Platform=Win32

构建时,编译输出显示:

(snip)
Build FAILED.

"C:\Users\Portponky\Documents\Visual Studio 2013\Projects\Test\Test.sln" (default target) (1) ->
"C:\Users\Portponky\Documents\Visual Studio 2013\Projects\Test\Test\Test.vcxproj" (default target) (2) ->
(ClCompile target) -> 
  c:\users\Portponky\documents\visual studio 2013\projects\test\test\test.cpp(9): error C3861: 'deliberately_missing_function': identifier not found [C:\Users\Portponky\Documents\Visual Studio 2013\Projects\Test\Test\Test.vcxproj]

    0 Warning(s)
    1 Error(s)

这不会在“问题”面板中拾取和显示。我的 QtCreator 配置了在选项的 'kits' 部分中设置的正确编译器。我知道 QtCreator 应该支持读取 msbuild 错误,但我很困惑,因为它似乎根本不起作用。

我认为这是因为 QtCreator 3.3.2 的默认 error/warning 解析器不接受以下形式的错误:

path/to/file.cpp(123): Error: blah blah blah

只接受:

path/to/file.cpp(123) : Error: blah blah blah

关键区别在于结束行号括号之间的 space。我通过在 Visual Studio 中添加一个自定义构建步骤来将虚假错误消息回显到控制台并查看 QtCreator 拾取了哪些来推断这一点。

为了解决这个问题,我创建了一个名为 msbuild_wrapper.bat 的批处理文件,它使用了来自 Cygwin 的 sed.exe:

@"C:\Program Files (x86)\MSBuild.0\Bin\MSBuild.exe" %* | c:\cygwin64\bin\sed.exe 's/):/) :/g'

它只是使用给定的参数运行 msbuild,然后使用 sed 将输出中出现的所有“):”替换为“) :”。在 QtCreator 的项目设置中,我将编译器设置为 msbuild_wrapper.bat 并在参数中添加了 /clp:NoSummary 以阻止错误出现两次。

一旦到位,QtCreator 就会正确地拾取所有错误和警告,并将它们与正确的文件和行号一起放置在 'Issues' 面板中。