在VS Code中使用C ++和WSL
在本教程中,您將配置Visual Studio Code以在Linux的Windows子系統(WSL)的Ubuntu上使用GCC C ++編譯器(g ++)和GDB調試器。GCC代表GNU編譯器集合;GDB是GNU調試器。WSL是Windows中的Linux環境,可以直接在計算機硬件上運行,而不是在虛擬機中運行。
注意:本教程的大部分內容都適用於直接在Linux機器上使用C ++和VS Code。
Visual Studio Code支持使用Remote-WSL擴展名直接在WSL中工作。我們建議採用這種WSL開發模式,在該模式下,所有源代碼文件(除編譯器外)都託管在Linux發行版上。有關更多背景信息,請參見VS代碼遠程開發。
完成本教程後,您將準備創建和配置自己的C ++項目,並瀏覽VS Code文檔以獲取有關其許多功能的更多信息。本教程不會教您有關GCC或Linux或C ++語言的信息。對於這些主題,Web上有許多不錯的資源。
如果您有任何問題,請隨時在VS Code文檔庫中提交本教程的問題。
先決條件
要成功完成本教程,您必須執行以下步驟:
-
安裝Remote-WSL擴展。
-
安裝適用於Linux的Windows子系統,然後使用同一頁面上的鏈接安裝您選擇的Linux發行版。本教程使用Ubuntu。在安裝過程中,請記住您的Linux用戶密碼,因爲安裝其他軟件將需要它。
設置您的Linux環境
-
打開WSL的Bash shell。如果安裝了Ubuntu發行版,請在Windows搜索框中鍵入“ Ubuntu”,然後在結果列表中單擊它。對於Debian,鍵入“ Debian”,依此類推。
該外殼將顯示一個命令提示符,默認情況下該命令提示符由您的用戶名和計算機名組成,並將您置於主目錄中。對於Ubuntu,它看起來像這樣:
-
創建一個目錄
projects
,然後在該目錄下創建一個子目錄helloworld
:<span style="color:#333333"><code><span style="color:#000000">mkdir projects</span> <span style="color:#795e26">cd</span><span style="color:#000000"> projects</span> <span style="color:#000000">mkdir helloworld</span></code></span>
-
儘管將使用VS Code編輯源代碼,但是您將使用g ++編譯器在Linux上編譯源代碼。您還將使用GDB在Linux上進行調試。這些工具默認未在Ubuntu上安裝,因此您必須安裝它們。幸運的是,該任務非常簡單!
-
在WSL命令提示符下,首先運行
apt-get update
以更新Ubuntu軟件包列表。過時的發行版有時會干擾嘗試安裝新軟件包。<span style="color:#333333"><code><span style="color:#000000">sudo apt-get update</span></code></span>
如果願意,還可以運行
sudo apt-get update && sudo apt-get dist-upgrade
以下載系統軟件包的最新版本,但這可能會花費更長的時間,具體取決於您的連接速度。 -
在命令提示符下,鍵入以下命令來安裝GNU編譯器工具和GDB調試器:
<span style="color:#333333"><code><span style="color:#000000">sudo apt-get install build-essential gdb</span></code></span>
-
通過找到g ++和gdb來驗證安裝是否成功。如果沒有從
whereis
命令返回文件名,請嘗試再次運行update命令。<span style="color:#333333"><code><span style="color:#000000">whereis g++</span> <span style="color:#000000">whereis gdb</span></code></span>
注意:如果直接在Linux機器而不是WSL上工作,則適用於安裝g ++編譯器和GDB調試器的設置步驟。在helloworld項目中運行VS Code,以及編輯,構建和調試步驟是相同的。
在WSL中運行VS代碼
導航到helloworld項目文件夾,然後從WSL終端啓動VS Code code .
:
<span style="color:#333333"><code><span style="color:#795e26">cd</span> <span style="color:#001080">$HOME</span><span style="color:#000000">/projects/helloworld</span>
<span style="color:#000000">code </span><span style="color:#795e26">.</span></code></span>
您將看到有關“安裝VS Code服務器”的消息。VS Code正在Linux端下載並安裝小型服務器,然後桌面VS Code將與之對話。然後,VS Code將啓動並打開helloWorld
文件夾。文件資源管理器顯示VS Code現在在帶有標題欄[WSL:Ubuntu]的WSL上下文中運行。
您還可以從狀態欄中告訴遠程上下文。
如果單擊“遠程狀態”欄項目,將看到適合該會話的“遠程”命令的下拉列表。例如,如果要結束在WSL中運行的會話,則可以從下拉列表中選擇“ 關閉遠程連接”命令。運行code .
從WSL命令提示符將重新啓動VS代碼在運行WSL。
該代碼。命令在當前工作文件夾中打開了VS Code,這將成爲您的“工作區”。在學習本教程的過程中,您將看到.vscode
在工作區的文件夾中創建的三個文件:
c_cpp_properties.json
(編譯器路徑和IntelliSense設置)tasks.json
(製作說明)launch.json
(調試器設置)
添加源代碼文件
在文件資源管理器標題欄中,選擇“ 新建文件”按鈕並命名該文件helloworld.cpp
。
安裝C / C ++擴展
創建文件並且VS Code檢測到它是C ++語言文件後,如果尚未安裝Microsoft C / C ++擴展名,則可能會提示您安裝它。
在“擴展”視圖中顯示按鈕時,選擇“ 安裝”,然後選擇“ 需要重新加載”以完成C / C ++擴展的安裝。
如果您已經在VS Code中本地安裝了C / C ++語言擴展,則需要轉到“擴展”視圖(Ctrl + Shift + X)並將這些擴展安裝到WSL中。通過選擇“ 在WSL中安裝”按鈕,然後選擇“ 需要重新加載”,可以將本地安裝的擴展安裝到WSL中。
添加Hello World源代碼
現在粘貼此源代碼:
<span style="color:#333333"><code><span style="color:#0000ff">#include </span><span style="color:#a31515"><iostream></span>
<span style="color:#0000ff">#include </span><span style="color:#a31515"><vector></span>
<span style="color:#0000ff">#include </span><span style="color:#a31515"><string></span>
<span style="color:#0000ff">using</span> <span style="color:#0000ff">namespace</span> <span style="color:#267f99">std</span><span style="color:#000000">;</span>
<span style="color:#0000ff">int</span> <span style="color:#795e26">main</span><span style="color:#000000">()</span>
<span style="color:#000000">{</span>
<span style="color:#000000"> vector<string> msg {</span><span style="color:#a31515">"Hello"</span><span style="color:#000000">, </span><span style="color:#a31515">"C++"</span><span style="color:#000000">, </span><span style="color:#a31515">"World"</span><span style="color:#000000">, </span><span style="color:#a31515">"from"</span><span style="color:#000000">, </span><span style="color:#a31515">"VS Code"</span><span style="color:#000000">, </span><span style="color:#a31515">"and the C++ extension!"</span><span style="color:#000000">};</span>
<span style="color:#0000ff">for</span><span style="color:#000000"> (</span><span style="color:#0000ff">const</span><span style="color:#000000"> string& word : msg)</span>
<span style="color:#000000"> {</span>
<span style="color:#000000"> cout << word << </span><span style="color:#a31515">" "</span><span style="color:#000000">;</span>
<span style="color:#000000"> }</span>
<span style="color:#000000"> cout << endl;</span>
<span style="color:#000000">}</span></code></span>
現在按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 ++編譯器,以基於源代碼創建可執行文件。
在主菜單中,選擇Terminal > Configure Default Build Task。在下拉列表中,將顯示任務下拉列表,其中列出了C ++編譯器的各種預定義構建任務。選擇g ++ build active file,它將構建當前在編輯器中顯示(活動)的文件。
這將tasks.json
在.vscode
文件夾中創建一個文件,然後在編輯器中將其打開。
您的新tasks.json
文件應類似於以下JSON:
<span style="color:#333333"><code><span style="color:#000000">{</span>
<span style="color:#0451a5">"version"</span><span style="color:#000000">: </span><span style="color:#a31515">"2.0.0"</span><span style="color:#000000">,</span>
<span style="color:#0451a5">"tasks"</span><span style="color:#000000">: [</span>
<span style="color:#000000"> {</span>
<span style="color:#0451a5">"type"</span><span style="color:#000000">: </span><span style="color:#a31515">"shell"</span><span style="color:#000000">,</span>
<span style="color:#0451a5">"label"</span><span style="color:#000000">: </span><span style="color:#a31515">"g++ build active file"</span><span style="color:#000000">,</span>
<span style="color:#0451a5">"command"</span><span style="color:#000000">: </span><span style="color:#a31515">"/usr/bin/g++"</span><span style="color:#000000">,</span>
<span style="color:#0451a5">"args"</span><span style="color:#000000">: [</span><span style="color:#a31515">"-g"</span><span style="color:#000000">, </span><span style="color:#a31515">"${file}"</span><span style="color:#000000">, </span><span style="color:#a31515">"-o"</span><span style="color:#000000">, </span><span style="color:#a31515">"${fileDirname}/${fileBasenameNoExtension}"</span><span style="color:#000000">],</span>
<span style="color:#0451a5">"options"</span><span style="color:#000000">: {</span>
<span style="color:#0451a5">"cwd"</span><span style="color:#000000">: </span><span style="color:#a31515">"/usr/bin"</span>
<span style="color:#000000"> },</span>
<span style="color:#0451a5">"problemMatcher"</span><span style="color:#000000">: [</span><span style="color:#a31515">"$gcc"</span><span style="color:#000000">],</span>
<span style="color:#0451a5">"group"</span><span style="color:#000000">: {</span>
<span style="color:#0451a5">"kind"</span><span style="color:#000000">: </span><span style="color:#a31515">"build"</span><span style="color:#000000">,</span>
<span style="color:#0451a5">"isDefault"</span><span style="color:#000000">: </span><span style="color:#0000ff">true</span>
<span style="color:#000000"> }</span>
<span style="color:#000000"> }</span>
<span style="color:#000000"> ]</span>
<span style="color:#000000">}</span></code></span>
該command
設置指定要運行的程序;在這種情況下是g ++。該args
數組指定將傳遞給g ++的命令行參數。必須按照編譯器期望的順序指定這些參數。此任務告訴g ++獲取活動文件(${file}
),對其進行編譯,然後在當前目錄(${fileDirname}
)中創建一個與活動文件同名但沒有擴展名(${fileBasenameNoExtension}
)的可執行文件,helloworld
以我們的示例爲例。
注意:您可以
task.json
在變量參考中瞭解有關變量的更多信息。
該label
值就是您將在任務列表中看到的值;您可以隨意命名。
對象中的"isDefault": true
值group
指定當您按Ctrl + Shift + B時將運行此任務。此屬性僅出於方便起見;如果將其設置爲false,您仍然可以從“終端”菜單中使用“ 任務:運行構建任務”來運行它。
運行構建
-
回到
helloworld.cpp
。您的任務將生成活動文件,並且您要生成helloworld.cpp
。 -
要運行中定義的構建任務
tasks.json
,請按Ctrl + Shift + B或從“ 終端”主菜單中選擇“ 任務:運行構建任務”。 -
任務啓動時,您應該看到“集成終端”面板出現在源代碼編輯器下方。任務完成後,終端將顯示編譯器的輸出,指示構建成功還是失敗。對於成功的g ++構建,輸出看起來像這樣:
-
使用+按鈕創建一個新終端,您將在WSL上下文中運行一個bash終端,並將
helloworld
文件夾作爲工作目錄。運行ls
,您現在應該看到可執行文件helloworld
(沒有文件擴展名)。 -
您可以
helloworld
在終端中輸入來運行./helloworld
。
修改task.json
您可以tasks.json
使用"${workspaceFolder}/*.cpp"
代替的參數來修改以構建多個C ++文件${file}
。您也可以通過替換"${fileDirname}/${fileBasenameNoExtension}"
爲硬編碼的文件名(例如“ helloworld.out”)來修改輸出文件名。
調試helloworld.cpp
接下來,您將創建一個launch.json
文件,以配置VS Code以在按F5調試程序時啓動GDB調試器。從主菜單中,選擇“運行” >“ 添加配置...”,然後選擇“ C ++(GDB / LLDB)”。
然後,您將看到各種預定義調試配置的下拉列表。選擇g ++構建並調試活動文件。
VS Code創建一個launch.json
文件,在編輯器中將其打開,然後生成並運行“ helloworld”。
<span style="color:#333333"><code><span style="color:#000000">{</span>
<span style="color:#0451a5">"version"</span><span style="color:#000000">: </span><span style="color:#a31515">"0.2.0"</span><span style="color:#000000">,</span>
<span style="color:#0451a5">"configurations"</span><span style="color:#000000">: [</span>
<span style="color:#000000"> {</span>
<span style="color:#0451a5">"name"</span><span style="color:#000000">: </span><span style="color:#a31515">"g++ build and debug active file"</span><span style="color:#000000">,</span>
<span style="color:#0451a5">"type"</span><span style="color:#000000">: </span><span style="color:#a31515">"cppdbg"</span><span style="color:#000000">,</span>
<span style="color:#0451a5">"request"</span><span style="color:#000000">: </span><span style="color:#a31515">"launch"</span><span style="color:#000000">,</span>
<span style="color:#0451a5">"program"</span><span style="color:#000000">: </span><span style="color:#a31515">"${fileDirname}/${fileBasenameNoExtension}"</span><span style="color:#000000">,</span>
<span style="color:#0451a5">"args"</span><span style="color:#000000">: [],</span>
<span style="color:#0451a5">"stopAtEntry"</span><span style="color:#000000">: </span><span style="color:#0000ff">false</span><span style="color:#000000">,</span>
<span style="color:#0451a5">"cwd"</span><span style="color:#000000">: </span><span style="color:#a31515">"${workspaceFolder}"</span><span style="color:#000000">,</span>
<span style="color:#0451a5">"environment"</span><span style="color:#000000">: [],</span>
<span style="color:#0451a5">"externalConsole"</span><span style="color:#000000">: </span><span style="color:#0000ff">false</span><span style="color:#000000">,</span>
<span style="color:#0451a5">"MIMode"</span><span style="color:#000000">: </span><span style="color:#a31515">"gdb"</span><span style="color:#000000">,</span>
<span style="color:#0451a5">"setupCommands"</span><span style="color:#000000">: [</span>
<span style="color:#000000"> {</span>
<span style="color:#0451a5">"description"</span><span style="color:#000000">: </span><span style="color:#a31515">"Enable pretty-printing for gdb"</span><span style="color:#000000">,</span>
<span style="color:#0451a5">"text"</span><span style="color:#000000">: </span><span style="color:#a31515">"-enable-pretty-printing"</span><span style="color:#000000">,</span>
<span style="color:#0451a5">"ignoreFailures"</span><span style="color:#000000">: </span><span style="color:#0000ff">true</span>
<span style="color:#000000"> }</span>
<span style="color:#000000"> ],</span>
<span style="color:#0451a5">"preLaunchTask"</span><span style="color:#000000">: </span><span style="color:#a31515">"g++ build active file"</span><span style="color:#000000">,</span>
<span style="color:#0451a5">"miDebuggerPath"</span><span style="color:#000000">: </span><span style="color:#a31515">"/usr/bin/gdb"</span>
<span style="color:#000000"> }</span>
<span style="color:#000000"> ]</span>
<span style="color:#000000">}</span></code></span>
該program
設置指定要調試的程序。在這裏,它被設置爲活動文件文件夾${fileDirname}
和活動文件名,不帶擴展名${fileBasenameNoExtension}
,如果helloworld.cpp
是,則爲活動文件helloworld
。
默認情況下,C ++擴展不會在您的源代碼中添加任何斷點,並且該stopAtEntry
值設置爲false
。將stopAtEntry
值更改true
爲會導致調試器main
在啓動調試時在該方法上停止。
其餘步驟作爲可選練習提供,以幫助您熟悉編輯和調試經驗。
開始調試會話
- 返回到
helloworld.cpp
它是活動文件。 - 按F5或從主菜單中選擇“運行”>“開始調試”。在開始逐步執行代碼之前,讓我們花一點時間注意用戶界面中的一些更改:
-
集成終端出現在源代碼編輯器的底部。在“ 調試輸出”選項卡中,您將看到指示調試器已啓動並正在運行的輸出。
-
編輯器突出顯示方法中的第一條語句
main
。這是C ++擴展自動爲您設置的斷點: -
左側的“運行”視圖顯示調試信息。您將在本教程的後面看到一個示例。
-
在代碼編輯器的頂部,將顯示一個調試控制面板。您可以通過抓住左側的點在屏幕上移動它。
單步執行代碼
現在,您準備開始逐步執行代碼。
-
單擊或按調試控制面板中的“ 跳過”圖標。
這會將程序執行推進到for循環的第一行,並跳過在創建和初始化變量時調用的
vector
和string
類內的所有內部函數調用msg
。注意左側“ 變量”窗口中的更改。在這種情況下,將出現錯誤,因爲儘管調試器現在可以看到循環的變量名,但該語句尚未執行,因此此時無任何內容可讀取。的內容
msg
是可見的,但是,因爲該聲明已完成。 -
再次按Step over前進到該程序中的下一條語句(跳過爲初始化循環而執行的所有內部代碼)。現在,“ 變量”窗口顯示有關循環變量的信息。
-
再次按Step over執行
cout
語句。(請注意,自2019年3月發行版起,直到循環退出,C ++擴展才將任何輸出輸出到調試控制檯。) -
如果願意,可以繼續按Step over,直到將引導程序中的所有單詞都打印到控制檯爲止。但是,如果您感到好奇,請嘗試按“ 跳入”按鈕以逐步瀏覽C ++標準庫中的源代碼!
要返回自己的代碼,一種方法是按住“ 跳過”。另一種方法是在代碼中設置斷點,方法是切換到
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)等。
您可以通過運行命令C / C ++來查看C / C ++配置UI :從命令面板(Ctrl + Shift + P)編輯配置(UI)。
這將打開“ C / C ++配置”頁面。當您在此處進行更改時,VS Code會將其寫入到文件夾中稱爲c_cpp_properties.json
的.vscode
文件中。
僅當程序包含工作空間或標準庫路徑中沒有的頭文件時,才需要修改“ 包含路徑”設置。
Visual Studio Code將這些設置放在中.vscode/c_cpp_properties.json
。如果直接打開該文件,則它應如下所示:
<span style="color:#333333"><code><span style="color:#000000">{</span>
<span style="color:#0451a5">"configurations"</span><span style="color:#000000">: [</span>
<span style="color:#000000"> {</span>
<span style="color:#0451a5">"name"</span><span style="color:#000000">: </span><span style="color:#a31515">"Linux"</span><span style="color:#000000">,</span>
<span style="color:#0451a5">"includePath"</span><span style="color:#000000">: [</span><span style="color:#a31515">"${workspaceFolder}/**"</span><span style="color:#000000">],</span>
<span style="color:#0451a5">"defines"</span><span style="color:#000000">: [],</span>
<span style="color:#0451a5">"compilerPath"</span><span style="color:#000000">: </span><span style="color:#a31515">"/usr/bin/gcc"</span><span style="color:#000000">,</span>
<span style="color:#0451a5">"cStandard"</span><span style="color:#000000">: </span><span style="color:#a31515">"c11"</span><span style="color:#000000">,</span>
<span style="color:#0451a5">"cppStandard"</span><span style="color:#000000">: </span><span style="color:#a31515">"c++17"</span><span style="color:#000000">,</span>
<span style="color:#0451a5">"intelliSenseMode"</span><span style="color:#000000">: </span><span style="color:#a31515">"clang-x64"</span>
<span style="color:#000000"> }</span>
<span style="color:#000000"> ],</span>
<span style="color:#0451a5">"version"</span><span style="color:#000000">: </span><span style="color:#098658">4</span>
<span style="color:#000000">}</span></code></span>
結束WSL會議
在WSL中完成工作後,可以使用主文件菜單和命令面板(Ctrl + Shift + P)中的“ 關閉遠程連接”命令來關閉遠程會話。這將重新啓動在本地運行的VS Code。通過選擇帶有[WSL]後綴的文件夾,您可以從文件 > 打開最近的列表中輕鬆地重新打開WSL會話。