自动停止 Visual C++ 2008 在第一次编译错误处?

48

我知道可以编译单个源文件,但有时候——比如当编辑一个被多个.cpp文件使用的头文件时——需要重新编译多个源文件。这就是 "Build" 命令的作用。

在 VC9(Visual C++ 2008)中,“Build” 命令的默认行为是尝试编译所有需要编译的文件。有时候这会导致许多编译失败。我通常只会观察错误并手动按下 ctrl-break 停止构建。

是否有一种配置方式,使得在第一个编译错误(而不是第一个构建失败)出现时自动停止构建呢?


2
亲爱的未来的人们 - 在VS 2010+中,试试StopOnFirstBuildError扩展。 - brichins
6个回答

28

我有一个更好的宏,它会在第一个错误/错误后立即停止(一旦构建窗口更新)。

Visual Studio -> 工具 -> 宏 -> 宏IDE... (或 ALT+F11)

Private Sub OutputWindowEvents_OnPaneUpdated(ByVal pPane As OutputWindowPane) Handles OutputWindowEvents.PaneUpdated
    If Not (pPane.Name = "Build") Then Exit Sub

    pPane.TextDocument.Selection.SelectAll()
    Dim Context As String = pPane.TextDocument.Selection.Text
    pPane.TextDocument.Selection.EndOfDocument()

    Dim found As Integer = Context.IndexOf(": error ")

    If found > 0 Then
        DTE.ExecuteCommand("Build.Cancel")
    End If

End Sub 

希望这对你们有所帮助。


1
根据我的声望页面,我没有被投反对票。我不知道。 - Eric
2
您不需要使用“选择全部”;您应该能够执行类似 bool found = pPane.TextDocument.StartPoint.CreateEditPoint().FindPattern(": error") 的操作。这样做应该更快,因为它不依赖于在每个窗格更新时复制输出窗口的整个文本。 - Noah Richards
@Noah Richards,感谢您的参与!我找不到那个,所以我选择了SA。下次我启动VS时,我会尝试一下并更新答案。 - Eric
如果这个方法不行,请告诉我,我会尝试找到其他的方法(我没有实际尝试过,只是查了一下API)。虽然它并不直接适用,但你可以在这里看到我对VS2010版本这个问题的回答:https://dev59.com/MnA75IYBdhLWcg3w6Nhj#3042159。 - Noah Richards
这会在每次更新时扫描整个输出,效率非常低。更好的方法是更新宏,只查看添加的每一行或其他文本增量。 - void.pointer
显示剩余2条评论

17

可以通过添加一个宏来完成,该宏在响应事件OnBuildProjConfigDone时运行。

宏如下所示:

Private Sub BuildEvents_OnBuildProjConfigDone(ByVal Project As String, ByVal ProjectConfig As String, ByVal Platform As String, ByVal SolutionConfig As String, ByVal Success As Boolean) Handles BuildEvents.OnBuildProjConfigDone

  If Success = False Then
    DTE.ExecuteCommand("Build.Cancel")
  End If

End Sub

1
此方法会在第一个项目失败而非第一个编译错误处停止构建。 - jwfearn
4
是的,但对我来说,这已经足够接近了(与建造下一个20个项目然后停止相比)。 - jmatthias
1
我想这取决于项目中有多少文件以及你要编译什么。如果我更改了一个在各处都包含的文件,它可能会触发一个相当长的重建过程,如果我有一个拼写错误,我宁愿让我的构建立即停止。也许VC10(使用MSBuild)能够做到我想要的。 - jwfearn
7
这不是原帖作者所寻找的,但却正好是我在寻找的。如果不明显,您可以通过转到“工具”->“宏”->“宏IDE”,打开“EnvironmentEvents”并将其粘贴进去来添加它。 - mhenry1384
你还可以在 DTE.ExecuteCommand("Build.Cancel") 之后添加 DTE.ExecuteCommand("View.ErrorList"),这样它会立即显示错误列表面板。 - Samuel
我在VS宏IDE的MyMacros下添加了一个新的宏。现在,当我构建时,如何让它运行?我是否需要将其与我的VS解决方案关联起来? - sizzle

8

是的,这在 MSVC 2005-2010 上运行良好:

Public Module EnvironmentEvents
  Private Sub OutputWindowEvents_OnPaneUpdated(ByVal pPane As OutputWindowPane) Handles OutputWindowEvents.PaneUpdated
    If Not (pPane.Name = "Build") Then Exit Sub

    Dim foundError As Boolean = pPane.TextDocument.StartPoint.CreateEditPoint().FindPattern(": error")
    Dim foundFatal As Boolean = pPane.TextDocument.StartPoint.CreateEditPoint().FindPattern(": fatal error")

    If foundError Or foundFatal Then
      DTE.ExecuteCommand("Build.Cancel")
    End If
  End Sub
End Module

1
在VS 2008中对我有用,谢谢。我添加了一件事来打开错误列表 DTE.Windows.Item(EnvDTE80.WindowKinds.vsWindowKindErrorList).Activate() - Thomas

3
我知道这个问题是关于VS 2008的,但我在寻找VS 2012的同样答案时偶然发现了它。由于VS 2012不再支持宏,因此宏解决方案将不再起作用。
你可以下载一个扩展,据说它适用于VS 2010和2012,在这里下载。我可以确认它在VS 2012中运行良好。
原始扩展链接在回复中给出。

1

你也可以下载this扩展程序,它似乎适用于每个版本的Visual Studio


1

这里有这篇文章 - 不确定它是否会在第一个错误或解决方案中的第一个失败的项目处停止构建。

Ctrl + Break 也可以手动停止它。

现在如果有办法在构建失败后停止花费10分钟重建智能感知就好了!


但是Ctrl + Break会损坏正在创建的文件,因此您必须显式地重新编译它们。 - Lev
2
链接中描述的方法会在第一个项目失败而非第一个编译错误时停止构建。 - jwfearn
存档链接为Visual Studio提示:终止构建! - zhenguoli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接