為 Microsoft C++ 配置 VS Code
在本教程中,你將在 Windows 上配置 Visual Studio Code 以使用 Microsoft Visual C++ 編譯器和偵錯程式。
配置 VS Code 後,你將在 VS Code 中編譯和除錯一個簡單的 Hello World 程式。本教程不教授有關 Microsoft C++ 工具集或 C++ 語言的詳細資訊。對於這些主題,網上有許多很好的資源。
如果你有任何問題,請隨時在 VS Code 文件儲存庫中為本教程提交問題。
先決條件
要成功完成本教程,你必須執行以下操作:
-
安裝 VS Code 的 C/C++ 擴充套件。你可以透過在“擴充套件”檢視 (⇧⌘X (Windows、Linux 為 Ctrl+Shift+X)) 中搜索“c++”來安裝 C/C++ 擴充套件。
-
安裝 Microsoft Visual C++ (MSVC) 編譯器工具集。
如果你有最新版本的 Visual Studio,請從 Windows“開始”選單開啟 Visual Studio Installer,並驗證“C++ 工作負載”是否已勾選。如果未安裝,請勾選該框,然後在安裝程式中選擇“修改”按鈕。
你也可以在不完整安裝 Visual Studio IDE 的情況下安裝“使用 C++ 的桌面開發”工作負載。從 Visual Studio 下載頁面,向下滾動直到在“所有下載”部分下看到“Tools for Visual Studio”,然後選擇“Build Tools for Visual Studio 2022”的下載項。
這將啟動 Visual Studio Installer,它將彈出一個對話方塊,顯示可用的 Visual Studio 生成工具工作負載。勾選“使用 C++ 的桌面開發”工作負載,然後選擇“安裝”。
注意:只要你還擁有有效的 Visual Studio 許可證(Community、Pro 或 Enterprise),就可以將 Visual Studio Build Tools 中的 C++ 工具集與 Visual Studio Code 一起使用,以開發、構建和測試任何 C++ 程式碼。
檢查你的 Microsoft Visual C++ 安裝
要從命令列或 VS Code 使用 MSVC,你必須從“Developer Command Prompt for Visual Studio”(Visual Studio 開發人員命令提示符)執行。普通的 Shell(如 PowerShell、Bash 或 Windows 命令提示符)沒有設定必要的路徑環境變數。
要開啟 VS 的開發人員命令提示符,請在 Windows“開始”選單中開始輸入“developer”,你應該會在建議列表中看到它出現。確切的名稱取決於你安裝的 Visual Studio 或 Visual Studio Build Tools 的版本。選擇該項以開啟提示符。
你可以透過輸入“cl”來測試你是否正確安裝了 C++ 編譯器 cl.exe
,你應該會看到一條包含版本和基本用法描述的版權訊息。
如果開發人員命令提示符使用 BuildTools 位置作為起始目錄(你不會想把專案放在那裡),請在開始建立新專案之前導航到你的使用者資料夾 (C:\users\{your username}\
)。
注意:如果由於某種原因你無法從“開發人員命令提示符”執行 VS Code,你可以在在開發人員命令提示符之外執行 VS Code中找到用 VS Code 構建 C++ 專案的解決方法。
建立 Hello World
從開發人員命令提示符,建立一個名為“projects”的空資料夾,你可以在其中儲存所有 VS Code 專案,然後建立一個名為“helloworld”的子資料夾,導航到其中,並透過輸入以下命令在該資料夾 (.
) 中開啟 VS Code (code
):
mkdir projects
cd projects
mkdir helloworld
cd helloworld
code .
“code .”命令會在當前工作資料夾中開啟 VS Code,該資料夾成為你的“工作區”。在學習本教程的過程中,你將看到在工作區的 .vscode
資料夾中建立了三個檔案:
tasks.json
(生成說明)launch.json
(偵錯程式設定)c_cpp_properties.json
(編譯器路徑和 IntelliSense 設定)
新增原始碼檔案
在“檔案資源管理器”標題欄中,選擇新建檔案按鈕並將檔案命名為 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
在你的新 helloworld.cpp
檔案中,將滑鼠懸停在 vector
或 string
上以檢視型別資訊。在宣告 msg
變數後,開始輸入 msg.
,就像呼叫成員函式時一樣。你應該會立即看到一個顯示所有成員函式的補全列表,以及一個顯示 msg
物件型別資訊的視窗:
你可以按 Tab 鍵插入所選成員;然後,當你新增左括號時,你將看到有關該函式所需任何引數的資訊。
執行 helloworld.cpp
請記住,C++ 擴充套件使用你機器上安裝的 C++ 編譯器來生成程式。在嘗試在 VS Code 中執行和除錯 helloworld.cpp
之前,請確保已安裝 C++ 編譯器。
-
開啟
helloworld.cpp
,使其成為活動檔案。 -
單擊編輯器右上角的播放按鈕。
-
從系統中檢測到的編譯器列表中選擇“C/C++: cl.exe build and debug active file”。
你只會在第一次執行 helloworld.cpp
時被要求選擇一個編譯器。此編譯器將被設定為 tasks.json
檔案中的“預設”編譯器。
-
生成成功後,你的程式輸出將顯示在整合終端中。
如果嘗試使用 cl.exe 構建和除錯時出錯,請確保你已使用 code .
快捷方式從 Visual Studio 開發人員命令提示符啟動了 VS Code。
第一次執行程式時,C++ 擴充套件會建立 tasks.json
,你會在專案中的 .vscode
資料夾中找到它。tasks.json
儲存生成配置。
你的新 tasks.json
檔案應類似於下面的 JSON
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "C/C++: cl.exe build active file",
"command": "cl.exe",
"args": [
"/Zi",
"/EHsc",
"/Fe:",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"${file}"
],
"problemMatcher": ["$msCompile"],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
]
}
注意:你可以在變數參考中瞭解有關
tasks.json
變數的更多資訊。
command
設定指定要執行的程式;在本例中是“cl.exe”。args
陣列指定將傳遞給 cl.exe 的命令列引數。這些引數必須按照編譯器期望的順序列出。
此任務告訴 C++ 編譯器獲取活動檔案 (${file}
),對其進行編譯,並在當前目錄 (${fileDirname}
) 中建立一個可執行檔案(/Fe:
開關),其名稱與活動檔案相同,但副檔名為 .exe
(${fileBasenameNoExtension}.exe
),在我們的示例中,結果是 helloworld.exe
。
label
值是你在任務列表中將看到的內容;你可以隨意命名。
detail
的值是你將在任務列表中看到的任務描述。強烈建議重新命名此值以將其與類似任務區分開來。
problemMatcher
值選擇用於在編譯器輸出中查詢錯誤和警告的輸出解析器。對於 cl.exe,如果你使用 $msCompile
問題匹配器,將獲得最佳結果。
從現在開始,播放按鈕將從 tasks.json
中讀取資訊,以確定如何構建和執行你的程式。你可以在 tasks.json
中定義多個構建任務,而標記為預設的任務將被播放按鈕使用。如果你需要更改預設編譯器,可以執行任務: 配置預設生成任務。或者,你可以修改 tasks.json
檔案,並透過替換以下段落來刪除預設設定
"group": {
"kind": "build",
"isDefault": true
},
替換為
"group": "build",
修改 tasks.json
你可以修改你的 tasks.json
以構建多個 C++ 檔案,方法是使用類似 "${workspaceFolder}/*.cpp"
的引數而不是 "${file}"
。這將構建你當前資料夾中的所有 .cpp
檔案。你還可以透過將 "${fileDirname}\\${fileBasenameNoExtension}.exe"
替換為硬編碼的檔名(例如 "${workspaceFolder}\\myProgram.exe"
)來修改輸出檔名。
除錯 helloworld.cpp
要除錯你的程式碼,
- 回到
helloworld.cpp
,使其成為活動檔案。 - 透過單擊編輯器邊距或在當前行使用 F9 設定斷點。
- 從播放按鈕旁邊的下拉選單中,選擇除錯 C/C++ 檔案。
- 從系統中檢測到的編譯器列表中選擇“C/C++: cl.exe build and debug active file”(只有在第一次執行或除錯
helloworld.cpp
時,系統才會要求你選擇編譯器)。
播放按鈕有兩種模式:“執行 C/C++ 檔案”和“除錯 C/C++ 檔案”。它將預設為上次使用的模式。如果你在播放按鈕中看到除錯圖示,你可以直接選擇播放按鈕進行除錯,而無需選擇下拉選單項。
如果嘗試使用 cl.exe 構建和除錯時出錯,請確保你已使用 code .
快捷方式從 Visual Studio 開發人員命令提示符啟動了 VS Code。
探索偵錯程式
在開始單步除錯程式碼之前,我們花點時間注意使用者介面中的幾處變化
-
整合終端出現在原始碼編輯器的底部。在除錯輸出選項卡中,你將看到指示偵錯程式已啟動並正在執行的輸出。
-
編輯器會高亮顯示你在啟動偵錯程式之前設定斷點的行
-
左側的執行和除錯檢視顯示除錯資訊。你將在本教程的後面看到一個示例。
-
程式碼編輯器頂部會出現一個除錯控制面板。你可以透過抓取左側的點來在螢幕上移動它。
單步除錯程式碼
現在你已準備好開始單步除錯程式碼。
-
單擊或按下除錯控制面板中的跳過圖示。
這將使程式執行前進到 for 迴圈的第一行,並跳過在建立和初始化
msg
變數時呼叫的vector
和string
類中的所有內部函式呼叫。請注意左側“變數”視窗中的變化。在這種情況下,出現錯誤是正常的,因為儘管迴圈的變數名現在對偵錯程式可見,但該語句尚未執行,因此此時沒有任何內容可讀取。然而,
msg
的內容是可見的,因為該語句已經完成。 -
再次按跳過以推進到此程式中的下一個語句(跳過用於初始化迴圈的所有內部程式碼)。現在,變數視窗顯示有關迴圈變數的資訊。
-
再次按“單步跳過”以執行
cout
語句。(請注意,在迴圈退出之前,C++ 擴充套件不會向“除錯控制檯”列印任何輸出。) -
如果你願意,可以繼續按單步跳過,直到向量中的所有單詞都列印到控制檯。但如果你好奇,可以嘗試按單步進入按鈕來單步執行 C++ 標準庫中的原始碼!
要返回到你自己的程式碼,一種方法是繼續按單步跳過。另一種方法是在你的程式碼中設定一個斷點,方法是切換到程式碼編輯器中的
helloworld.cpp
選項卡,將插入點放在迴圈內的cout
語句的某處,然後按 F9。左側的邊欄會出現一個紅點,表示已在此行設定了斷點。然後按 F5 從標準庫標頭檔案的當前行開始執行。執行將在
cout
處中斷。如果你願意,可以再次按 F9 來關閉斷點。
設定監視
有時你可能希望在程式執行時跟蹤變數的值。你可以透過在變數上設定一個“監視”來實現這一點。
-
將插入點放在迴圈內部。在“監視”視窗中,選擇加號,並在文字框中輸入
word
,這是迴圈變數的名稱。現在,在單步執行迴圈時檢視“監視”視窗。 -
透過在迴圈前新增此語句來新增另一個監視:
int i = 0;
。然後,在迴圈內部新增此語句:++i;
。現在,像上一步一樣為i
新增監視。 -
要在執行暫停在斷點處時快速檢視任何變數的值,你可以將滑鼠指標懸停在其上方。
使用 launch.json 自定義除錯
當你使用播放按鈕或 F5 進行除錯時,C++ 擴充套件會即時建立一個動態除錯配置。
在某些情況下,你可能希望自定義除錯配置,例如指定在執行時傳遞給程式的引數。你可以在 launch.json
檔案中定義自定義除錯配置。
要建立 launch.json
,請從播放按鈕下拉選單中選擇新增除錯配置。
然後你會看到一個包含各種預定義除錯配置的下拉列表。選擇“C/C++: cl.exe build and debug active file”。
VS Code 建立一個 launch.json
檔案,它看起來像這樣
{
"version": "0.2.0",
"configurations": [
{
"name": "C/C++: cl.exe build and debug active file",
"type": "cppvsdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"preLaunchTask": "C/C++: cl.exe build active file"
}
]
}
在上面的 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
的檔案。
Visual Studio Code 將這些設定放在 .vscode\c_cpp_properties.json
中。如果你直接開啟該檔案,它應該看起來像這樣:
{
"configurations": [
{
"name": "Win32",
"includePath": ["${workspaceFolder}/**"],
"defines": ["_DEBUG", "UNICODE", "_UNICODE"],
"windowsSdkVersion": "10.0.18362.0",
"compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/VC/Tools/MSVC/14.24.28314/bin/Hostx64/x64/cl.exe",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "msvc-x64"
}
],
"version": 4
}
只有當你的程式包含不在你的工作區或標準庫路徑中的標頭檔案時,你才需要向“Include path”陣列設定新增內容。
編譯器路徑
compilerPath
設定是你的配置中一個重要的設定。擴充套件使用它來推斷 C++ 標準庫標頭檔案的路徑。當擴充套件知道在哪裡找到這些檔案時,它可以提供有用的功能,如智慧補全和“轉到定義”導航。
C/C++ 擴充套件會根據它在你的系統上找到的內容,嘗試使用預設的編譯器位置來填充 compilerPath
。該擴充套件會查詢幾個常見的編譯器位置。
compilerPath
的搜尋順序是:
- 首先檢查 Microsoft Visual C++ 編譯器。
- 然後在適用於 Linux 的 Windows 子系統 (WSL) 上查詢 g++。
- 然後是 Mingw-w64 的 g++。
如果你安裝了 g++ 或 WSL,你可能需要更改 compilerPath
以匹配你專案的首選編譯器。對於 Microsoft C++,路徑應該類似於這樣,具體取決於你安裝的特定版本:“C:/Program Files (x86)/Microsoft Visual Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x64/cl.exe”。
重用你的 C++ 配置
VS Code 現在已配置為使用 Microsoft C++ 編譯器。該配置適用於當前工作區。要重用該配置,只需將 JSON 檔案複製到新專案資料夾(工作區)的 .vscode
資料夾中,並根據需要更改原始檔和可執行檔案的名稱。
在開發人員命令提示符之外執行 VS Code
在某些情況下,無法從“Visual Studio 開發人員命令提示符”執行 VS Code(例如,在透過 SSH 進行遠端開發的情況下)。在這種情況下,你可以使用以下 tasks.json
配置在構建期間自動初始化“Visual Studio 開發人員命令提示符”:
{
"version": "2.0.0",
"windows": {
"options": {
"shell": {
"executable": "cmd.exe",
"args": [
"/C",
// The path to VsDevCmd.bat depends on the version of Visual Studio you have installed.
"\"C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/Tools/VsDevCmd.bat\"",
"&&"
]
}
}
},
"tasks": [
{
"type": "shell",
"label": "cl.exe build active file",
"command": "cl.exe",
"args": [
"/Zi",
"/EHsc",
"/Fe:",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"${file}"
],
"problemMatcher": ["$msCompile"],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
注意:
VsDevCmd.bat
的路徑可能會因 Visual Studio 版本或安裝路徑而異。你可以透過開啟命令提示符並執行dir "\VsDevCmd*" /s
來找到VsDevCmd.bat
的路徑。
故障排除
“cl.exe”一詞無法識別
如果你看到錯誤“‘cl.exe’一詞未被識別為 cmdlet、函式、指令碼檔案或可執行程式的名稱”,這通常意味著你正在“Visual Studio 開發人員命令提示符”之外執行 VS Code,並且 VS Code 不知道 cl.exe
編譯器的路徑。
VS Code 必須從 Visual Studio 開發人員命令提示符啟動,或者任務必須配置為在開發人員命令提示符之外執行。
你可以透過開啟一個新的終端 (⌃⇧` (Windows, Linux Ctrl+Shift+`)) 並輸入“cl”來驗證 cl.exe
是否可用於 VS Code,從而隨時檢查你是否在開發人員命令提示符的上下文中執行 VS Code。
致命錯誤 C1034: assert.h: 未設定 include 路徑
在這種情況下,cl.exe
雖然透過 PATH
環境變數對 VS Code 可用,但 VS Code 仍需要從“Visual Studio 開發人員命令提示符”啟動,或者被配置為在開發人員命令提示符之外執行。否則,cl.exe
將無法訪問重要的環境變數,例如 INCLUDE
。
後續步驟
- 探索 VS Code 使用者指南。
- 檢視 C++ 擴充套件概述。
- 建立一個新工作區,將你的
.vscode
JSON 檔案複製到其中,為新工作區路徑、程式名稱等調整必要的設定,然後開始編碼吧!