善用 vs 中的錯誤列表和輸出窗口,高效查找 C++ 多工程編譯錯誤

前言

相信,絕大多數小夥伴兒編譯 C++ 或者其它語言的程序都遇到過編譯錯誤。今天簡單總結一下如何使用錯誤列表(Error List)輸出窗口(Output) 排查編譯 C++ 代碼產生的編譯錯誤。簡單的錯誤,經過錯誤列表就能夠搞定,可是一些複雜的錯誤,只經過錯誤列表極可能是沒法解決的,須要藉助輸出窗口的幫助。ide

錯誤列表

錯誤列表能夠用來查看編譯時的錯誤、警告等信息。在一條記錄上雙擊,便可切換到對應的代碼行,是咱們排查編譯錯誤的好幫手。通常狀況下,若是編譯出錯,錯誤列表會自動彈出來,若是沒有彈出來,能夠手動打開。函數

1. 打開方式ui

咱們能夠在 View 菜單下找到 Error List,點擊便可打開。對應的快捷鍵是 ctrl + \, e (按住ctrl,而後依次按 \e 便可)。3d

若是以爲麻煩,仍是但願編譯出錯時自動打開錯誤列表的話,咱們能夠在Tools -> Options-> Projects and Solutions -> General 裏設置。調試

show-error-list-when-compile-fail-setting
show-error-list-when-compile-fail-setting

勾選 Always show Error List if build finishes with errors,能夠在編譯完成後,若是有錯誤,則會自動彈出 Error List 窗口。code

2. 錯誤列表界面概覽cdn

咱們先經過一張圖來了解下錯誤列表。blog

Error-List-Introduction
Error-List-Introduction

咱們發現有 7 列,每一列都有它的做用。排序

  • 第 1 列:Category,以圖標的形式表示信息的類型。進程

    • 大紅叉 是真正的錯誤。
    • 小紅叉 通常是智能提示給出的,不是真正意義上的錯誤。對是否能成功編譯沒有影響。
    • 黃色三角形+歎號 通常是警告信息。
    • 圓形+歎號 通常是提示信息。
  • 第 2 列:Default Order,提示信息的編號。我沒關注過。

  • 第 3 列:Description ,簡要描述,能夠粗略判斷下錯誤。

  • 第 4 列:File ,文件。若是是頭文件的話,有可能須要排查包含的此頭文件的源文件。

  • 第 5 列:Line ,行號。

  • 第 6 列:Column ,列號。

  • 第 7 列:Project,工程。提示信息關聯的工程,若是項目裏有多個工程,能夠根據此列進行一個初步的過濾。

若是不想顯示 Intellisense Error,能夠右鍵,取消勾選 Show IntelliSense Errors

能夠根據任意一列排序(雙擊對應列標題便可排序),或者 右鍵Sort By 選擇須要排序的列。

能夠顯示或者隱藏任意一列,右鍵, Show Columns 選擇須要顯示/隱藏的列便可。

3. 過濾

Error List 是支持過濾的,善用過濾能夠幫咱們快速找到關心的信息。

點擊左側漏洞形狀的按鈕旁邊的下拉按鈕,能夠看到三種選項:

  • Open Documents :只保留與當前全部打開的文檔相關的信息。

  • Current Project :只保留全部屬於當前工程的信息。

  • Curent Document :只保留與當前文檔相關的信息。

能夠在右側的 Search Error List 編輯框輸入過濾的關鍵字,不過遺憾的是不支持模糊匹配和正則匹配。

下面是我錄製的一個基本的過濾示例,你們能夠直接感覺下。

Error-List-Filter-Demo
Error-List-Filter-Demo

輸出窗口

輸出窗口不只能夠顯示各類調試信息,還能夠顯示編譯的輸出信息,好比編譯錯誤、編譯警告等。有些編譯錯誤,僅經過錯誤列表不能解決,這時候咱們須要藉助輸出窗口的幫助。

1. 打開方式

咱們能夠在 View 菜單下找到 Output,點擊便可打開。對應的快捷鍵是 ctrl + alt + o

若是但願在編譯時自動打開輸出窗口的話,咱們能夠在Tools -> Options-> Projects and Solutions -> General 裏設置。

勾選 Show Output window when build starts 能夠在編譯開始的時候自動彈出輸出窗口。能夠參考錯誤列表打開方式的截圖。

2. 簡要介紹

輸出窗口用法比較簡單,鼠標移動到對應的按鈕上就有懸浮提示,不一一介紹了。咱們能夠根據 Show output from: 選項過濾不一樣來源的信息。我見過如下幾種:

  • Build:編譯產生的信息。

  • Build Order:編譯產生的信息,按順序顯示。

  • Debug:調試輸出信息。若是被調試的進程經過 OutputDebugString() 或等價的 API 輸出調試信息,則會顯示在此分類下。

  • Source Control - Git:來自版本管理系統 Git的信息,vs 檢測到當前有代碼被 Git 管理,則會出現此分類。

  • Source Control - Team Foundation:來自版本管理系統 Team Foundation 的信息,若是 vs 檢測到當前代碼被TFS 管理,則會出現此分類。

  • Solution:工程加載類消息。若是某個工程加載失敗,會在該分類下顯示錯誤提示。

**說明:**若是某一行包含 path\to\file(line): 形式的信息,雙擊便可跳轉到對應文件的特定行。

在檢查編譯錯誤時,咱們使用的是 BuildBuild Order。其中的 Build Order 尤爲有用,能夠按順序顯示輸出信息。試想,若是解決方案(Solution)下有不少項目(Project)的話,編譯的時候,項目間的編譯輸出頗有可能混到一塊兒,不利於咱們排查。經過 Build Order 可讓輸出有序。而後咱們能夠按 ctrl + home 鍵跳轉到開頭,而後搜索搜索error,就能夠快速找到第一條錯誤信息了。下面是兩個使用輸出窗口排查編譯錯誤的實戰。

實戰

實戰1. 查找頭文件中的編譯錯誤實戰

下圖中的編譯錯誤,所有提示出如今頭文件中。

error-in-header-file
error-in-header-file

咱們雙擊後會跳轉到頭文件。

jump-to-error-line
jump-to-error-line

除了知道錯誤發生在第 6 行,咱們並不能獲得更多有用信息了。咱們須要找到是哪一個源文件包含了這個頭文件,到源文件裏進一步查找緣由。這時候咱們須要切換到輸出窗口了。

在輸出窗口顯示錯誤-未排序
在輸出窗口顯示錯誤-未排序

從上圖中咱們看不出來究竟是哪一個源文件包含了出問題的頭文件。咱們須要切換到 Build Order,以下圖:

在輸出窗口顯示錯誤-排序
在輸出窗口顯示錯誤-排序

咱們發現 MFCApplication2.cppMFCActiveXControl1.cppMFCActiveXControl2.cpp 包含了 d4d.h。咱們能夠進行下一步的排查了,由於這個問題比較有意思,具體排查過程會單獨寫一篇文章。

實戰2. 查找名字解析錯誤實戰

下圖是嘗試匹配重載函數失敗時,錯誤列表給出的錯誤提示。

錯誤列表
錯誤列表

從提示中咱們得知,在 4 個重載函數中沒有一個能匹配給定的兩個參數。可是編譯器具體嘗試匹配了哪些函數呢?咱們沒法從錯誤列表得知。不過咱們能夠經過輸出窗口查看編譯器具體嘗試匹配了哪些函數,以下圖:

輸出窗口
輸出窗口

咱們能夠發現,在咱們提供的四個重載函數中,沒有一個函數能夠徹底匹配給定的兩個參數,編譯器就懵逼了,不知道應該選擇哪一個了,因此就報錯了。

本例只是一個超級簡單的例子,並不能很好的突出輸出窗口的做用。通常涉及模板的編譯錯誤會有一大串。這時候經過輸出窗口查看具體的匹配過程就很重要了。

總結

  • 善用 錯誤列表的過濾功能,能夠幫咱們快速找到關心的信息。
  • 輸出窗口中的 Build Order 可讓輸出有序,在查找 多工程編譯輸出的時候,有助於咱們快速找到相關代碼。
  • 錯誤列表 + 輸出窗口 + 一些設置 基本上能夠解決絕大多數編譯錯誤。

參考資料

https://docs.microsoft.com/en-us/visualstudio/ide/reference/error-list-window?view=vs-2019

https://docs.microsoft.com/en-us/visualstudio/ide/reference/output-window?view=vs-2019

相關文章
相關標籤/搜索