現已釋出!閱讀關於 11 月新增功能和修復的內容。

使用 GCC 和 MinGW

在本教程中,您將配置 Visual Studio Code,以使用來自 mingw-w64 的 GCC C++ 編譯器 (g++) 和 GDB 偵錯程式來建立在 Windows 上執行的程式。配置 VS Code 後,您將編譯、執行和除錯一個 Hello World 程式。

本教程不介紹 GCC、GDB、minGW-w64 或 C++ 語言。關於這些主題,網路上有很多優秀的資源。

如果您遇到任何問題,請隨時在 VS Code 文件儲存庫 中為此教程提交 issue。

先決條件

要成功完成本教程,你必須執行以下步驟

  1. 安裝 Visual Studio Code

  2. 安裝 VS Code 的 C/C++ 擴充套件。您可以透過在“擴充套件”檢視中搜索“C++”來安裝 C/C++ 擴充套件(⇧⌘X (Windows、Linux Ctrl+Shift+X))。

    C/C++ extension

安裝 MinGW-w64 工具鏈

透過 MSYS2 獲取最新版本的 MinGW-w64,MSYS2 提供 GCC、MinGW-w64 和其他有用的 C++ 工具及庫的最新原生構建。這將為您提供編譯程式碼、除錯程式碼以及配置程式碼以配合 IntelliSense 工作所需的工具。

要安裝 MinGW-w64 工具鏈,請觀看此影片或按照以下步驟操作

  1. 您可以從 MSYS2 頁面下載最新的安裝程式,或使用此 安裝程式直接連結

  2. 執行安裝程式並按照安裝嚮導的步驟進行。請注意,MSYS2 要求 64 位 Windows 8.1 或更高版本。

  3. 在嚮導中,選擇您所需的安裝資料夾。記下此目錄以備後用。在大多數情況下,推薦的目錄是可接受的。當您到達設定開始選單快捷方式的步驟時,情況也相同。完成後,請確保選中“立即執行 MSYS2”框,然後選擇“完成”。這將為您開啟一個 MSYS2 終端視窗。

  4. 在此終端中,透過執行以下命令安裝 MinGW-w64 工具鏈

    pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain
    
  5. 透過按 Enter 鍵接受 toolchain 組中的預設軟體包數量。

    MYSS2 Installer

  6. 在提示是否繼續安裝時,輸入 Y

  7. 使用以下步驟將 MinGW-w64 bin 資料夾的路徑新增到 Windows PATH 環境變數中

    1. 在 Windows 搜尋欄中,鍵入“設定”以開啟 Windows 設定。
    2. 搜尋“編輯賬戶的環境變數”。
    3. 在“使用者變數”中,選擇 Path 變數,然後選擇“編輯”。
    4. 選擇“新建”,然後將您在安裝過程中記錄的 MinGW-w64 目標資料夾新增到列表中。如果您使用了上述預設設定,那麼路徑將是:C:\msys64\ucrt64\bin
    5. 選擇“確定”,然後在“環境變數”視窗中再次選擇“確定”以更新 PATH 環境變數。您必須重新開啟任何控制檯視窗,以便更新後的 PATH 環境變數可用。

檢查您的 MinGW 安裝

要檢查您的 MinGW-w64 工具是否已正確安裝並可用,請開啟一個的命令提示符並鍵入

gcc --version
g++ --version
gdb --version

您應該會看到顯示已安裝的 GCC、g++ 和 GDB 版本的輸出。如果不是這樣

  1. 確保您的 PATH 變數條目與安裝工具鏈的 MinGW-w64 二進位制檔案位置匹配。如果編譯器在該 PATH 條目處不存在,請確保您已按照前面的說明進行操作。
  2. 如果 gcc 輸出正確但 gdb 沒有,則需要從 MinGW-w64 工具集中安裝您缺少的軟體包。
    • 如果在編譯時收到“miDebuggerPath 的值無效。”訊息,一個可能的原因是您缺少 mingw-w64-gdb 軟體包。

建立 Hello World 應用

首先,讓我們設定一個專案。

  1. 啟動 Windows 命令提示符(在 Windows 搜尋欄中輸入Windows 命令提示符)。
  2. 執行以下命令。這些命令將建立一個名為 projects 的空資料夾,您可以在其中放置所有 VS Code 專案。然後,接下來的命令將建立並導航到名為 helloworld 的子資料夾。從那裡,您將直接在 VS Code 中開啟 helloworld
mkdir projects
cd projects
mkdir helloworld
cd helloworld
code .

“code .”命令會在當前工作資料夾中開啟 VS Code,該資料夾將成為您的“工作區”。請透過選擇“是,我信任作者”來接受工作區信任對話方塊,因為這是您建立的資料夾。

在您進行本教程的過程中,您會發現在工作區中的 .vscode 資料夾中建立了三個檔案

  • tasks.json(生成說明)
  • launch.json(偵錯程式設定)
  • c_cpp_properties.json(編譯器路徑和 IntelliSense 設定)

新增 Hello World 原始檔

在“檔案資源管理器”標題欄中,選擇新建檔案按鈕並將檔案命名為 helloworld.cpp

New File title bar button

新增 Hello World 原始碼

現在貼上以下原始碼

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    vector<string> msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"};

    for (const string& word : msg)
    {
        cout << word << " ";
    }
    cout << endl;
}

現在按 ⌘S (Windows、Linux 為 Ctrl+S) 儲存檔案。請注意,你剛剛新增的檔案出現在 VS Code 側邊欄的檔案資源管理器檢視 (⇧⌘E (Windows、Linux 為 Ctrl+Shift+E)) 中

File Explorer

您還可以透過選擇“檔案”>“自動儲存”來啟用自動儲存,以自動儲存檔案更改。您可以在 VS Code 的使用者介面文件中找到有關其他檢視的更多資訊。

注意:當你儲存或開啟 C++ 檔案時,你可能會看到來自 C/C++ 擴充套件的關於 Insiders 版本可用性的通知,該版本可讓你測試新功能和修復。你可以透過選擇 X清除通知)來忽略此通知。

探索 IntelliSense

IntelliSense 是一種透過新增程式碼編輯功能(如程式碼完成、引數資訊、快速資訊和成員列表)來幫助您更快、更高效地編碼的工具。

要檢視 IntelliSense 的實際效果,請將滑鼠懸停在 vectorstring 上以檢視其型別資訊。如果您在第 10 行鍵入 msg.,您會看到一個建議的成員函式呼叫列表,所有這些都由 IntelliSense 生成。

Statement completion IntelliSense

您可以按 Tab 鍵插入選定的成員。如果您隨後新增開括號,IntelliSense 將顯示有關所需引數的資訊。

如果 IntelliSense 尚未配置,請開啟命令面板(⇧⌘P (Windows、Linux Ctrl+Shift+P))並輸入“選擇 IntelliSense 配置”。在編譯器下拉列表中,選擇 Use gcc.exe 進行配置。有關更多資訊,請參閱IntelliSense 配置文件

執行 helloworld.cpp

請記住,C++ 擴充套件使用您機器上安裝的 C++ 編譯器來構建程式。在嘗試在 VS Code 中執行和除錯 helloworld.cpp 之前,請確保您已完成“安裝 MinGW-w64 工具鏈”步驟。

  1. 開啟 helloworld.cpp,使其成為活動檔案。

  2. 單擊編輯器右上角的播放按鈕。

    Screenshot of helloworld.cpp and play button

  3. 從系統中檢測到的編譯器列表中選擇“C/C++: g++.exe build and debug active file”。

    C++ debug configuration dropdown

你只會在第一次執行 helloworld.cpp 時被要求選擇一個編譯器。此編譯器將被設定為 tasks.json 檔案中的“預設”編譯器。

  1. 生成成功後,你的程式輸出將顯示在整合終端中。

    screenshot of program output

恭喜!您剛剛在 VS Code 中運行了第一個 C++ 程式!

瞭解 tasks.json

第一次執行程式時,C++ 擴充套件會建立一個 tasks.json 檔案,您可以在專案的 .vscode 資料夾中找到它。tasks.json 儲存您的構建配置。

你的新 tasks.json 檔案應類似於下面的 JSON

{
  "tasks": [
    {
      "type": "cppbuild",
      "label": "C/C++: g++.exe build active file",
      "command": "C:\\msys64\\ucrt64\\bin\\g++.exe",
      "args": [
        "-fdiagnostics-color=always",
        "-g",
        "${file}",
        "-o",
        "${fileDirname}\\${fileBasenameNoExtension}.exe"
      ],
      "options": {
        "cwd": "${fileDirname}"
      },
      "problemMatcher": ["$gcc"],
      "group": {
        "kind": "build",
        "isDefault": true
      },
      "detail": "Task generated by Debugger."
    }
  ],
  "version": "2.0.0"
}

注意:你可以在變數參考中瞭解有關 tasks.json 變數的更多資訊。

command 設定指定要執行的程式;在本例中是 g++

args 陣列指定傳遞給 g++ 的命令列引數。這些引數在此檔案中按編譯器期望的特定順序列出。

此任務指示 g++ 獲取活動檔案 (${file}),進行編譯,並在當前目錄 (${fileDirname}) 中建立一個輸出檔案(-o 開關),該檔案的名稱與活動檔案相同,但副檔名為 .exe${fileBasenameNoExtension}.exe)。對我們而言,這將生成 helloworld.exe

label 值是你在任務列表中將看到的內容;你可以隨意命名。

detail 值是您將在任務列表中看到的任務描述。強烈建議重新命名此值以區分類似的任務

problemMatcher 值選擇用於在編譯器輸出中查詢錯誤和警告的輸出解析器。對於 GCC,如果您使用 $gcc problem matcher,將獲得最佳結果。

從現在開始,播放按鈕將讀取 tasks.json 來確定如何構建和執行您的程式。您可以在 tasks.json 中定義多個構建任務,其中標記為預設的任務將由播放按鈕使用。如果您需要更改預設編譯器,可以在命令面板中執行“Tasks: Configure Default Build Task”。或者,您可以修改 tasks.json 檔案並刪除預設值,方法是替換此部分

    "group": {
        "kind": "build",
        "isDefault": true
    },

替換為

    "group": "build",

修改 tasks.json

從 2024 年 11 月 3 日開始,MSYS2 預設已停用 mingw-w64 的萬用字元支援。此更改會影響萬用字元(如 "*.cpp")在生成命令中的處理方式。要在 tasks.json 中生成多個 C++ 檔案,您必須明確列出檔案,使用 makecmake 等生成系統,或實現以下解決方法:https://www.msys2.org/docs/c/#expanding-wildcard-arguments。

如果您之前使用 "${workspaceFolder}/*.cpp" 來編譯當前資料夾中的所有 .cpp 檔案,這現在將不再直接有效。相反,您可以手動列出檔案或定義一個生成指令碼。

除錯 helloworld.cpp

要除錯你的程式碼,

  1. 回到 helloworld.cpp,使其成為活動檔案。
  2. 透過單擊編輯器邊距或在當前行使用 F9 設定斷點。helloworld.cpp 中斷點的螢幕截圖
  3. 從播放按鈕旁邊的下拉選單中,選擇除錯 C/C++ 檔案播放按鈕下拉選單的螢幕截圖
  4. 從系統中檢測到的編譯器列表中選擇“C/C++: g++ build and debug active file”(您只會在第一次執行或除錯 helloworld.cpp 時被要求選擇編譯器)。C++ 除錯配置下拉選單

播放按鈕有兩種模式:“執行 C/C++ 檔案”和“除錯 C/C++ 檔案”。它將預設為最後使用的模式。如果您在播放按鈕上看到除錯圖示,則可以直接選擇播放按鈕進行除錯,而無需使用下拉選單。

探索偵錯程式

在開始單步除錯程式碼之前,我們花點時間注意使用者介面中的幾處變化

  • 整合終端出現在原始碼編輯器底部。在“除錯控制檯”選項卡中,您會看到指示偵錯程式正在執行的輸出。

  • 編輯器會高亮顯示你在啟動偵錯程式之前設定斷點的行

    Initial breakpoint

  • 左側的執行和除錯檢視顯示除錯資訊。你將在本教程的後面看到一個示例。

  • 程式碼編輯器頂部會出現一個除錯控制面板。你可以透過抓取左側的點來在螢幕上移動它。

    Debugging controls

單步除錯程式碼

現在你已準備好開始單步除錯程式碼。

  1. 選擇除錯控制面板中的“步過”圖示。

    Step over button

    這將使程式執行前進到 for 迴圈的第一行,並跳過在建立和初始化 msg 變數時呼叫的 vectorstring 類中的所有內部函式呼叫。請注意左側“變數”視窗中的更改。

    Debugging windows

    在這種情況下,這些錯誤是預期的,因為雖然迴圈的變數名現在對偵錯程式可見,但該語句尚未執行,因此此時沒有可以讀取的內容。但是,msg 的內容是可見的,因為該語句已完成。

  2. 再次按跳過以推進到此程式中的下一個語句(跳過用於初始化迴圈的所有內部程式碼)。現在,變數視窗顯示有關迴圈變數的資訊。

  3. 再次按“步過”以執行 cout 語句。(請注意,C++ 擴充套件在迴圈退出之前不會向“除錯控制檯”列印任何輸出。)

  4. 如果你願意,可以繼續按單步跳過,直到向量中的所有單詞都列印到控制檯。但如果你好奇,可以嘗試按單步進入按鈕來單步執行 C++ 標準庫中的原始碼!

    要返回到你自己的程式碼,一種方法是繼續按單步跳過。另一種方法是在你的程式碼中設定一個斷點,方法是切換到程式碼編輯器中的 helloworld.cpp 選項卡,將插入點放在迴圈內的 cout 語句的某處,然後按 F9。左側的邊欄會出現一個紅點,表示已在此行設定了斷點。

    Breakpoint in main

    然後按 F5 從標準庫標頭檔案的當前行開始執行。執行將在 cout 處中斷。如果你願意,可以再次按 F9 來關閉斷點。

    迴圈完成後,您可以在整合終端中看到輸出,以及 GDB 輸出的其他一些診斷資訊。

    Debug output in terminal

設定監視

有時您可能希望在程式執行過程中跟蹤變數的值。您可以透過設定變數的監視來做到這一點。

  1. 將插入點放在迴圈內部。在“監視”視窗中,選擇加號,然後在文字框中鍵入 word,這是迴圈變數的名稱。現在,在逐行執行迴圈時,請檢視“監視”視窗。

    Watch window

  2. 透過在迴圈前新增此語句來新增另一個監視:int i = 0;。然後,在迴圈內部新增此語句:++i;。現在,像上一步一樣為 i 新增監視。

  3. 要在執行暫停在斷點處時快速檢視任何變數的值,你可以將滑鼠指標懸停在其上方。

    Mouse hover

使用 launch.json 自定義除錯

當你使用播放按鈕或 F5 進行除錯時,C++ 擴充套件會即時建立一個動態除錯配置。

在某些情況下,你可能希望自定義除錯配置,例如指定在執行時傳遞給程式的引數。你可以在 launch.json 檔案中定義自定義除錯配置。

要建立 launch.json,請從播放按鈕下拉選單中選擇新增除錯配置

Add debug configuration play button menu

然後,您將看到一個下拉列表,其中包含各種預定義的除錯配置。選擇“C/C++: g++.exe build and debug active file”。

C++ debug configuration dropdown

VS Code 在 .vscode 資料夾中建立一個 launch.json 檔案,該檔案看起來類似這樣

{
  "configurations": [
    {
      "name": "C/C++: g++.exe build and debug active file",
      "type": "cppdbg",
      "request": "launch",
      "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
      "args": [],
      "stopAtEntry": false,
      "cwd": "${fileDirname}",
      "environment": [],
      "externalConsole": false,
      "MIMode": "gdb",
      "miDebuggerPath": "C:\\msys64\\ucrt64\\bin\\gdb.exe",
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        },
        {
          "description": "Set Disassembly Flavor to Intel",
          "text": "-gdb-set disassembly-flavor intel",
          "ignoreFailures": true
        }
      ],
      "preLaunchTask": "C/C++: g++.exe build active file"
    }
  ],
  "version": "2.0.0"
}

在上面的 JSON 中,program 指定了您要除錯的程式。在這裡,它被設定為活動檔案資料夾(${fileDirname})和帶有 .exe 副檔名的活動檔名(${fileBasenameNoExtension}.exe),如果 helloworld.cpp 是活動檔案,則為 helloworld.exeargs 屬性是執行時傳遞給程式的引數陣列。

預設情況下,C++ 擴充套件不會向你的原始碼新增任何斷點,並且 stopAtEntry 值設定為 false

stopAtEntry 值更改為 true,以便在開始除錯時讓偵錯程式在 main 方法處停止。

從現在開始,播放按鈕和 F5 在啟動程式進行除錯時將從你的 launch.json 檔案中讀取資訊。

新增額外的 C/C++ 設定

如果你想對 C/C++ 擴充套件進行更多控制,可以建立一個 c_cpp_properties.json 檔案,它將允許你更改編譯器路徑、包含路徑、C++ 標準(預設為 C++17)等設定。

你可以透過從命令面板 (⇧⌘P (Windows、Linux 為 Ctrl+Shift+P)) 執行 C/C++: 編輯配置 (UI) 命令來檢視 C/C++ 配置 UI。

Command Palette

這將開啟C/C++ 配置頁面。當你在此處進行更改時,VS Code 會將它們寫入 .vscode 資料夾中名為 c_cpp_properties.json 的檔案。

在這裡,我們將“配置名稱”更改為“GCC”,將“編譯器路徑”下拉選單設定為 g++ 編譯器,並將“IntelliSense 模式”設定為與編譯器匹配(gcc-x64)。

Command Palette

Visual Studio Code 將這些設定放在 .vscode\c_cpp_properties.json 中。如果直接開啟該檔案,它應該看起來像這樣

{
  "configurations": [
    {
      "name": "GCC",
      "includePath": ["${workspaceFolder}/**"],
      "defines": ["_DEBUG", "UNICODE", "_UNICODE"],
      "windowsSdkVersion": "10.0.22000.0",
      "compilerPath": "C:/msys64/mingw64/bin/g++.exe",
      "cStandard": "c17",
      "cppStandard": "c++17",
      "intelliSenseMode": "windows-gcc-x64"
    }
  ],
  "version": 4
}

只有當您的程式包含不在工作區或標準庫路徑中的標頭檔案時,您才需要新增到“Include path”陣列設定中。強烈建議不要將系統包含路徑新增到我們支援的編譯器的 includePath 設定中。

編譯器路徑

該擴充套件使用 compilerPath 設定來推斷 C++ 標準庫標頭檔案的路徑。當該擴充套件知道在哪裡找到這些檔案時,它就可以提供智慧完成和“轉到定義”導航等功能。

C/C++ 擴充套件會嘗試使用系統上找到的預設編譯器填充 compilerPath。該擴充套件會在幾個常見的編譯器位置中進行搜尋,但只會自動選擇位於“Program Files”資料夾之一或其路徑列在 PATH 環境變數中的編譯器。如果找到 Microsoft Visual C++ 編譯器,則會選擇它,否則會選擇一個版本的 gcc、g++ 或 clang。

如果您安裝了多個編譯器,您可能需要更改 compilerPath 以匹配您專案的首選編譯器。您也可以使用命令面板中的“C/C++: Select IntelliSense Configuration...”命令來選擇擴充套件檢測到的編譯器之一。

故障排除

已安裝 MSYS2,但仍找不到 g++ 和 gdb

您必須按照 MSYS2 網站上的步驟,使用 MSYS CLI 安裝完整的 MinGW-w64 工具鏈(pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain)以及所有必需的先決條件。工具鏈包括 g++ 和 gdb。

作為 Windows 使用者,執行 pacman 命令時出現錯誤

Windows 機器上的 UCRT 僅包含在 Windows 10 或更高版本中。如果您使用的是其他版本的 Windows,請執行以下不使用 UCRT 的命令

pacman -S --needed base-devel mingw-w64-x86_64-toolchain

將 MinGW-w64 目標資料夾新增到您的環境變數列表時,預設路徑將是:C:\msys64\mingw64\bin

MinGW 32 位

如果您需要 32 位版本的 MinGW 工具集,請查閱 MSYS2 wiki 上的下載部分。其中包含 32 位和 64 位安裝選項的連結。

後續步驟

  • 探索 VS Code 使用者指南
  • 檢視 C++ 擴充套件概述
  • 建立一個新的工作區,將您的 .vscode JSON 檔案複製到其中,調整新工作區路徑、程式名稱等的必要設定,然後開始編碼!
© . This site is unofficial and not affiliated with Microsoft.