使用 GCC 和 MinGW
在本教程中,您將配置 Visual Studio Code,以使用來自 mingw-w64 的 GCC C++ 編譯器 (g++) 和 GDB 偵錯程式來建立在 Windows 上執行的程式。配置 VS Code 後,您將編譯、執行和除錯一個 Hello World 程式。
本教程不介紹 GCC、GDB、minGW-w64 或 C++ 語言。關於這些主題,網路上有很多優秀的資源。
如果您遇到任何問題,請隨時在 VS Code 文件儲存庫 中為此教程提交 issue。
先決條件
要成功完成本教程,你必須執行以下步驟
-
安裝 VS Code 的 C/C++ 擴充套件。您可以透過在“擴充套件”檢視中搜索“C++”來安裝 C/C++ 擴充套件(⇧⌘X (Windows、Linux Ctrl+Shift+X))。

安裝 MinGW-w64 工具鏈
透過 MSYS2 獲取最新版本的 MinGW-w64,MSYS2 提供 GCC、MinGW-w64 和其他有用的 C++ 工具及庫的最新原生構建。這將為您提供編譯程式碼、除錯程式碼以及配置程式碼以配合 IntelliSense 工作所需的工具。
要安裝 MinGW-w64 工具鏈,請觀看此影片或按照以下步驟操作
-
您可以從 MSYS2 頁面下載最新的安裝程式,或使用此 安裝程式直接連結。
-
執行安裝程式並按照安裝嚮導的步驟進行。請注意,MSYS2 要求 64 位 Windows 8.1 或更高版本。
-
在嚮導中,選擇您所需的安裝資料夾。記下此目錄以備後用。在大多數情況下,推薦的目錄是可接受的。當您到達設定開始選單快捷方式的步驟時,情況也相同。完成後,請確保選中“立即執行 MSYS2”框,然後選擇“完成”。這將為您開啟一個 MSYS2 終端視窗。
-
在此終端中,透過執行以下命令安裝 MinGW-w64 工具鏈
pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain -
透過按 Enter 鍵接受
toolchain組中的預設軟體包數量。
-
在提示是否繼續安裝時,輸入
Y。 -
使用以下步驟將 MinGW-w64
bin資料夾的路徑新增到 WindowsPATH環境變數中- 在 Windows 搜尋欄中,鍵入“設定”以開啟 Windows 設定。
- 搜尋“編輯賬戶的環境變數”。
- 在“使用者變數”中,選擇
Path變數,然後選擇“編輯”。 - 選擇“新建”,然後將您在安裝過程中記錄的 MinGW-w64 目標資料夾新增到列表中。如果您使用了上述預設設定,那麼路徑將是:
C:\msys64\ucrt64\bin。 - 選擇“確定”,然後在“環境變數”視窗中再次選擇“確定”以更新
PATH環境變數。您必須重新開啟任何控制檯視窗,以便更新後的PATH環境變數可用。
檢查您的 MinGW 安裝
要檢查您的 MinGW-w64 工具是否已正確安裝並可用,請開啟一個新的命令提示符並鍵入
gcc --version
g++ --version
gdb --version
您應該會看到顯示已安裝的 GCC、g++ 和 GDB 版本的輸出。如果不是這樣
- 確保您的 PATH 變數條目與安裝工具鏈的 MinGW-w64 二進位制檔案位置匹配。如果編譯器在該 PATH 條目處不存在,請確保您已按照前面的說明進行操作。
- 如果
gcc輸出正確但gdb沒有,則需要從 MinGW-w64 工具集中安裝您缺少的軟體包。- 如果在編譯時收到“miDebuggerPath 的值無效。”訊息,一個可能的原因是您缺少
mingw-w64-gdb軟體包。
- 如果在編譯時收到“miDebuggerPath 的值無效。”訊息,一個可能的原因是您缺少
建立 Hello World 應用
首先,讓我們設定一個專案。
- 啟動 Windows 命令提示符(在 Windows 搜尋欄中輸入Windows 命令提示符)。
- 執行以下命令。這些命令將建立一個名為
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。

新增 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)) 中

您還可以透過選擇“檔案”>“自動儲存”來啟用自動儲存,以自動儲存檔案更改。您可以在 VS Code 的使用者介面文件中找到有關其他檢視的更多資訊。
注意:當你儲存或開啟 C++ 檔案時,你可能會看到來自 C/C++ 擴充套件的關於 Insiders 版本可用性的通知,該版本可讓你測試新功能和修復。你可以透過選擇
X(清除通知)來忽略此通知。
探索 IntelliSense
IntelliSense 是一種透過新增程式碼編輯功能(如程式碼完成、引數資訊、快速資訊和成員列表)來幫助您更快、更高效地編碼的工具。
要檢視 IntelliSense 的實際效果,請將滑鼠懸停在 vector 或 string 上以檢視其型別資訊。如果您在第 10 行鍵入 msg.,您會看到一個建議的成員函式呼叫列表,所有這些都由 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 工具鏈”步驟。
-
開啟
helloworld.cpp,使其成為活動檔案。 -
單擊編輯器右上角的播放按鈕。

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

你只會在第一次執行 helloworld.cpp 時被要求選擇一個編譯器。此編譯器將被設定為 tasks.json 檔案中的“預設”編譯器。
-
生成成功後,你的程式輸出將顯示在整合終端中。

恭喜!您剛剛在 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++ 檔案,您必須明確列出檔案,使用 make 或 cmake 等生成系統,或實現以下解決方法:https://www.msys2.org/docs/c/#expanding-wildcard-arguments。
如果您之前使用 "${workspaceFolder}/*.cpp" 來編譯當前資料夾中的所有 .cpp 檔案,這現在將不再直接有效。相反,您可以手動列出檔案或定義一個生成指令碼。
除錯 helloworld.cpp
要除錯你的程式碼,
- 回到
helloworld.cpp,使其成為活動檔案。 - 透過單擊編輯器邊距或在當前行使用 F9 設定斷點。

- 從播放按鈕旁邊的下拉選單中,選擇除錯 C/C++ 檔案。

- 從系統中檢測到的編譯器列表中選擇“C/C++: g++ build and debug active file”(您只會在第一次執行或除錯
helloworld.cpp時被要求選擇編譯器)。
播放按鈕有兩種模式:“執行 C/C++ 檔案”和“除錯 C/C++ 檔案”。它將預設為最後使用的模式。如果您在播放按鈕上看到除錯圖示,則可以直接選擇播放按鈕進行除錯,而無需使用下拉選單。
探索偵錯程式
在開始單步除錯程式碼之前,我們花點時間注意使用者介面中的幾處變化
-
整合終端出現在原始碼編輯器底部。在“除錯控制檯”選項卡中,您會看到指示偵錯程式正在執行的輸出。
-
編輯器會高亮顯示你在啟動偵錯程式之前設定斷點的行

-
左側的執行和除錯檢視顯示除錯資訊。你將在本教程的後面看到一個示例。
-
程式碼編輯器頂部會出現一個除錯控制面板。你可以透過抓取左側的點來在螢幕上移動它。

單步除錯程式碼
現在你已準備好開始單步除錯程式碼。
-
選擇除錯控制面板中的“步過”圖示。

這將使程式執行前進到 for 迴圈的第一行,並跳過在建立和初始化
msg變數時呼叫的vector和string類中的所有內部函式呼叫。請注意左側“變數”視窗中的更改。
在這種情況下,這些錯誤是預期的,因為雖然迴圈的變數名現在對偵錯程式可見,但該語句尚未執行,因此此時沒有可以讀取的內容。但是,
msg的內容是可見的,因為該語句已完成。 -
再次按跳過以推進到此程式中的下一個語句(跳過用於初始化迴圈的所有內部程式碼)。現在,變數視窗顯示有關迴圈變數的資訊。
-
再次按“步過”以執行
cout語句。(請注意,C++ 擴充套件在迴圈退出之前不會向“除錯控制檯”列印任何輸出。) -
如果你願意,可以繼續按單步跳過,直到向量中的所有單詞都列印到控制檯。但如果你好奇,可以嘗試按單步進入按鈕來單步執行 C++ 標準庫中的原始碼!
要返回到你自己的程式碼,一種方法是繼續按單步跳過。另一種方法是在你的程式碼中設定一個斷點,方法是切換到程式碼編輯器中的
helloworld.cpp選項卡,將插入點放在迴圈內的cout語句的某處,然後按 F9。左側的邊欄會出現一個紅點,表示已在此行設定了斷點。
然後按 F5 從標準庫標頭檔案的當前行開始執行。執行將在
cout處中斷。如果你願意,可以再次按 F9 來關閉斷點。迴圈完成後,您可以在整合終端中看到輸出,以及 GDB 輸出的其他一些診斷資訊。

設定監視
有時您可能希望在程式執行過程中跟蹤變數的值。您可以透過設定變數的監視來做到這一點。
-
將插入點放在迴圈內部。在“監視”視窗中,選擇加號,然後在文字框中鍵入
word,這是迴圈變數的名稱。現在,在逐行執行迴圈時,請檢視“監視”視窗。
-
透過在迴圈前新增此語句來新增另一個監視:
int i = 0;。然後,在迴圈內部新增此語句:++i;。現在,像上一步一樣為i新增監視。 -
要在執行暫停在斷點處時快速檢視任何變數的值,你可以將滑鼠指標懸停在其上方。

使用 launch.json 自定義除錯
當你使用播放按鈕或 F5 進行除錯時,C++ 擴充套件會即時建立一個動態除錯配置。
在某些情況下,你可能希望自定義除錯配置,例如指定在執行時傳遞給程式的引數。你可以在 launch.json 檔案中定義自定義除錯配置。
要建立 launch.json,請從播放按鈕下拉選單中選擇新增除錯配置。

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

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.exe。args 屬性是執行時傳遞給程式的引數陣列。
預設情況下,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。

這將開啟C/C++ 配置頁面。當你在此處進行更改時,VS Code 會將它們寫入 .vscode 資料夾中名為 c_cpp_properties.json 的檔案。
在這裡,我們將“配置名稱”更改為“GCC”,將“編譯器路徑”下拉選單設定為 g++ 編譯器,並將“IntelliSense 模式”設定為與編譯器匹配(gcc-x64)。

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++ 擴充套件概述。
- 建立一個新的工作區,將您的
.vscodeJSON 檔案複製到其中,調整新工作區路徑、程式名稱等的必要設定,然後開始編碼!