Visual Studio Code官網文檔 https://code.visualstudio.com/docs/cpp/config-wsl
官網文檔還有編譯Python、Java的文檔,包括win、linux、macos,寫得很通俗,建議去看,flag:過四級的看不懂我倒立吃屏幕。
徒手翻譯原文,翻譯人是直譯翻譯者的死對頭,多處使用意譯翻譯。
文檔的很多內容可能用不到,結尾有總結,不想看翻譯的請滾到最后看配置項及說明。
官網文檔翻譯
在WSL上用VS code寫C++
在這個教程中,你會在Windows Subsystem for Linux(WSL)的Ubuntu系統上配置VS code,來使用GCC編譯工具和GDB調試工具。GCC代表GNU編譯器集合;GDB是GNU的調試器。WSL是Windows系統上的Linux子系統,它直接在真機上運行,而不是虛擬機。
注:教程的大部分內容可以直接在Linux設備上使用VS code做C++相關的工作。
VS code支持在WSL內直接用Remote-WSL擴展進行工作。我們推薦使用WSL開發模式,所有源碼文件還有編譯器都由Linux發行版管理。更多信息詳見VS Code Remote Development。
這個向導完成后,你將有能力創建並配置你的C++工程,並可以探索VS code的文檔,獲取更多關於它的特性的信息。此向導不會教你GCC、Linux或C++語言,關於這些問題的資源可以從網上獲得很多。
如果你有任何問題,請放心地在VS Code documentation repository為此教程提問。
前提條件
為了成功地完成此向導,你必須做下面幾項工作:
- 安裝VS code
- 安裝Remote - WSL extension
- 安裝Windows Subsystem for Linux,然后在頁面鏈接上安裝你選擇的Linux發行版本。此教程使用Ubuntu。安裝時務必記住你的Linux用戶密碼,因為在安裝其他軟件時需要它。
設置你的Linux環境
- 打開WSL的Bash終端。如果你安裝了一個Ubuntu發行版,在Windows搜索欄搜索“Ubuntu”然后在結果列表中點擊它。對於Debian發行版,搜索“Debian”一樣。

終端會顯示命令提示符,默認由你的用戶名和電腦名組成,並將你至於用戶的家目錄下。在Ubuntu上看起來像這樣:

- 創建一個目錄
projects,然后在其中創建子目錄helloworld:
mkdir projects
cd projects
mkdir helloworld
-
你將會在Linux系統用VS code編輯源代碼,也會用g++編譯器編譯代碼。同時,你也會在Linux中用GDB進行調試。這些工具在Ubuntu中默認不安裝,所以你要親自安裝它們。幸運的是,這些工作很簡單!
-
在WSL的命令提示符中,先運行
apt-get update來更新Ubuntu的包列表。過時的版本有時會干擾新軟件包的安裝。
sudo apt-get update
你也可以執行sudo apt-get update && sudo apt-get dist-upgrade指令,下載最新版本的系統包,但是這會因為網絡連接速度的約束而花費更多時間。
- 在命令行中安裝GNU編譯工具和GDB調試工具,命令如下:
sudo apt-get install build-essential gdb
- 通過定位g++和gdb來核實安裝是否成功。如果文件名沒有在
whereis命令中返回,試試再次運行更新命令。
whereis g++
whereis gdb
注:安裝g++編譯器和GDB調試器的步驟在Linux設備上進行而不是WSL。你要在你的helloworld工程中運行VS code,以及編輯、編譯和調試。
在WSL中運行VS code
在WSL的終端里切換到你的helloworld工程目錄,用code .打開VS code:
cd $HOME/projects/helloworld
code .
你會看到一條“安裝VScode Server”的消息。這時VS code正在給Linux端下載並安裝一個小服務器,桌面上的VS code會和它建立聯系。隨后VS code會啟動並打開helloworld目錄。文件管理器在標題欄顯示[WSL:Ubuntu],代表VS code正在WSL中運行。

你也可以在狀態欄看到遠程環境

如果點擊遠程狀態欄,你會看到遠程命令會話的列表。比如,你想結束WSL上的會話,你就可以在列表中選擇 關閉遠端連接 命令。在WSL命令提示符中執行 code . 命令會重新啟動VS code。
code . 命令會在當前目錄打開VS code,這個目錄就是你的“工作空間”。隨着教程的進行,你將看到在工作目錄的.vscode目錄中會創建三個文件:
c_cpp_properties.json(編譯路徑和智能配置)tasks.json(編譯說明)launch.json(調試設置)
添加源代碼文件
在文件管理標題欄上選擇 新文件 按鈕,創建一個 helloworld.cpp 文件。

安裝C/C++擴展
創建文件后,VS code會識別出它是個C++語言的文件,如你沒有安裝Microsoft C/C++ extension,它會提示你進行安裝。

擴展窗口顯示操作按鈕,選擇安裝,然后重新加載,完成C/C++擴展的安裝。
如果你已經在VS code中本地安裝了C/C++語言的擴展,你要在擴展擴展窗口(Ctrl+Shift+X)中把那些擴展安裝到WSL中。選擇 安裝到WSL 按鈕並 重新加載 ,本地安裝的擴展就會安裝到WSL上。

添加helloworld源代碼
粘貼這段代碼
#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;
}
按Ctrl+S保存文件。在VS code側邊欄的 文件管理 窗口(Ctrl+Shift+E)中,注意你剛添加的文件是怎樣顯示的。

你也可以打開自動保存功能,自動保存文件的改動,在 文件 主菜單中點擊 自動保存 。
你可以在最左側的活動欄打開不同窗口,比如 搜索 、 源代碼管理 和 運行 。在這個教程的后面你會看到 運行 窗口。你可以在VS code用戶接口文檔找到更多關於其他窗口的信息。
智能提示
在新建的 helloworld.cpp 文件中,把鼠標停在 vector 或者 string 上可以看到類型信息。聲明 msg 變量后,你想調用它的成員函數就要以 msg. 開頭。之后你會看到一個完整的列表顯示所有成員函數,旁邊還有一個窗口顯示 msg 對象的類型信息。

你可以按 Tab 鍵插入選擇的成員函數;之后,當寫上左括號時,你會看到該函數所有參數的信息。
編譯helloworld.cpp
接下來,你要創建 tasks.json 文件,告訴VS code怎樣編譯程序。這個工作會借助WSL的g++編譯器創建一個源代碼的可執行文件。
在主菜單欄選擇 終端 > 配置默認生成任務 ,出現一個下拉列表,展示了各種預定義的C++編譯器。選擇 g++ build active file ,這個選項會創建一個在編輯器中立刻顯示。

這個步驟會在.vscode目錄中創建一個tasks.json文件,並在編輯器中打開它。
新創建的 tasks.json 文件應該像JSON格式,比如下面這樣:
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "g++ build active file",
"command": "/usr/bin/g++",
"args": ["-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}"],
"options": {
"cwd": "/usr/bin"
},
"problemMatcher": ["$gcc"],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
command選項指明要運行的程序,這個例子中時g++。 args數組指明要傳給g++的命令行參數,這些參數的順序必須符合編譯器要求。這項工作是調用g++編譯目標文件(${file}),並在當前目錄(${fileDirname})創建一個沒有文件后綴的、與目標文件同名的可執行文件,此教程中的例子創建helloworld文件。
注:你可以在變量參考了解更多關於
tasks.json的變量內容。
label選項的值會在任務列表中顯示,你可以任性地修改它。
group對象中的"isDefault":true內容代表按Ctrl+Shift+B快捷鍵開始工作。這項配置只是為了方便;如果你把它設為false,你仍然可以在終端菜單中用運行生成任務來運行。
運行編譯
-
返回
helloworld.cpp。你將編譯helloworld.cpp。 -
按
Ctrl+Shift+B或者在終端主菜單中選擇運行生成任務,運行定義在tasks.json文件的編譯任務。 -
任務開始時,源代碼編輯框下面會出現終端面板。編譯完成后,終端會輸出編譯是否成功的相關信息。編譯成功的樣子像這樣:

- 點擊+按鈕創建新終端,這個終端運行在WSL環境中,以
helloworld文件的目錄為工作目錄。執行ls命令可以看到可執行文件helloworld(沒有文件后綴)。

- 在終端輸入
./helloworld運行helloworld。
修改tasks.json
你可以tasks.json來比編譯更多C++文件,比如用".cpp"代替${file}。你也可以將${fileDirname}/${fileBasenameNoExtension}換成一個固定的名字來修改輸出的文件名(比如改成“helloworld.out”)。
調試helloworld.cpp
接下來,你要創建一個launch.json文件來配置VS code,讓它在你按F5時調用GDB調試程序。在主菜單選擇運行 > 添加配置… 然后選擇 C++(GDB/LLDB)。
出現一個列表顯示各種預定義的調試配置。選擇g++ build and debug active file。

VS code創建一個launch.json文件並在編輯器中打開,然后編譯運行“helloworld”。
{
"version": "0.2.0",
"configurations": [
{
"name": "g++ build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "g++ build active file",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
program選項指定要調試的程序。這里設置的目標文件目錄${fileDirname}和無擴展名的目標文件${fileBasenameNoExtion}對應helloworld.cpp生成的目標文件helloworld。
這里默認,C++擴展不會源代碼中添加任何斷點,stopAtEntry的值為false。將stopAtEntry設為true會在開始調試時停在main函數位置。
剩下的步驟時可選聯系,可以幫助你熟悉編輯和調試。
開始調試會話
-
返回
helloworld.cpp,這是目前的目標文件。 -
按
F5或主菜單選擇運行 > 啟動調試。在單步調試之前,我們用一分鍾來了解一下用戶界面的改變:
- 代碼編輯框下面出現終端。在調試控制台標簽中,你可以看到調試器開始運行的輸出信息。
- 編輯器在
main函數的第一行高亮顯示。這是C++默認為你設置的斷點:

- 左側運行窗口顯示調試信息。在此向導的后面有例子。
- 在編輯器頂部出現一個調試控制面板。你可以抓着左側的幾個點移動它。

單步調試代碼
現在你可以准備開始單步調試代碼了。
- 在調試控制面板上點擊Step over圖表。

這會讓程序執行到循環的第一行,並在創建和初始化msg變量時跳過vector和string類的所有內部函數。注意左側變量窗口的變化。

這個例子中,理應會出現問題,雖然變量名對循環來說是可見的,但是還沒有執行到,所以這一步沒有內容可以讀。msg變量可以看到,因為那條語句已經完成了。
-
再次按Step over讓程序執行到下一個聲明(跳過所有初始化循環的內部代碼)。現在,變量窗口會展示循環中的變量信息。
-
再按Step over執行到
cout語句。(注意,在2019年3月發行的VS code中,C++擴展在循環結束前不會在調試控制台輸出任何信息。) -
你可以一直按Step over直到向量中的所有單詞都打印出來。如果你對Step Into按鈕很好奇,可以點擊它試一試,這會跳到C++標准庫代碼的內部!

要想回到你的代碼,一個方法是一直按Step over;另一個方法是切換到helloworld.cpp中,在程序循環內的cout語句處按F9添加斷點。在左側空白位置出現一個紅點表明斷點已添加到這一行。

然后按F5在標准庫中開始執行,程序會停在cout語句的位置。以可以再次按F9取消斷點。
循環結束后,在調試控制台可以看到輸出信息,同時還有GDB的其他調試信息。

設置監視器
有時,你可能想在程序執行時跟蹤變量的值。你可以為變量設置監聽實現這一功能。
- 把光標聚焦在循環中,在監視窗口點擊添加表達式然后輸入循環的變量
word。接下來,在調試時看着監視窗口。

-
在循環前加
int i = 0;語句,在循環中添加++i語句,同上一步添加i變量的監視。 -
執行到斷點時,如果想快速看到任何變量的值,你可以把鼠標停在它上面。

C/C++配置
如果你想對C/C++擴展進行更多控制,你可以創建一個c_cpp_properties.json文件,在其中可以配置很多設置,比如編譯器路徑、頭文件包含路徑和C++標准(默認C++17)等等。
你可以在命令面板(Ctrl+Shift+P)運行C/C++: Edit Configurations (UI)命令打開C/C++用戶界面配置。

這會打開C/C++配置頁面。當你在其中進行修改時,VS code會把修改內容寫到.vscode目錄的c_cpp_properties.json文件中。

如果你的程序的頭文件不再工作目錄或標准庫的頭文件中,你只修改Include path就夠了。
VS code會將這些設置放到.vscode/c_cpp_properties.json文件中,如果直接打開它,它看起來像這樣:
{
"configurations": [
{
"name": "Linux",
"includePath": ["${workspaceFolder}/**"],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}
關閉WSL會話
當你在WSL上完成工作后,你可以在主文件菜單和命令面板(Ctrl+Shift+P)執行關閉遠程連接命令退出會話。這會重新啟動運行在本地的VS code。你可以在文件 > 最近打開列表中選擇帶**[ WSL] **后綴的文件,重新打開WSL會話。
其他步驟
- 探索VS code用戶導航。
- 回顧C++擴展概述。
- 創加一個新的工作空間,把你的.json文件復制到其中,為新的工作空間調整需要的設置,程序名等等,然后開始敲代碼!
配置總結
文檔講的是在WSL上的ubuntu系統,不影響直接在ubuntu系統中進行配置。打開一個目錄作為工作空間,設置時會在.vscode目錄下創建兩個文件tasks.json和launch.json。可以直接手動創建目錄和文件,不用在VS code中設置。
- 創建
tasks.json文件,用於編譯。菜單欄選擇 終端 > 配置默認生成任務 ,出現一個下拉列表,展示了各種預定義的C++編譯器。選擇 g++ build active file。參考如下:
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "g++ go!go!go!",
"command": "/usr/bin/g++",
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "/usr/bin"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
command指明g++。args數組g++參數。當前文件目錄${fileDirname}。無文件后綴的、與源文件同名的可執行文件${fileBasenameNoExtension}。label隨便改。
isDefault:true代表按Ctrl+Shift+B快捷鍵開始工作。詳細內容參考Variables Reference。
- 創建
launch.json文件,用於運行調試。主菜單選擇運行(調試) > 添加配置… 然后選擇 C++(GDB/LLDB)。選g++ build and debug active file。launch.json參考:
{
// 使用 IntelliSense 了解相關屬性。
// 懸停以查看現有屬性的描述。
// 欲了解更多信息,請訪問: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "come on!",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "為 gdb 啟用整齊打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
program選項指定要調試的程序。
之后就能編譯、調試了。調試前記得先編譯源文件。
