在VS Code中使用C ++和WSL

在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文檔庫中提交本教程的問題。

先決條件

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

  1. 安裝Visual Studio代碼

  2. 安裝Remote-WSL擴展

  3. 安裝適用於Linux的Windows子系統,然後使用同一頁面上的鏈接安裝您選擇的Linux發行版。本教程使用Ubuntu。在安裝過程中,請記住您的Linux用戶密碼,因爲安裝其他軟件將需要它。

設置您的Linux環境

  1. 打開WSL的Bash shell。如果安裝了Ubuntu發行版,請在Windows搜索框中鍵入“ Ubuntu”,然後在結果列表中單擊它。對於Debian,鍵入“ Debian”,依此類推。

    開始菜單中的Ubuntu

    該外殼將顯示一個命令提示符,默認情況下該命令提示符由您的用戶名和計算機名組成,並將您置於主目錄中。對於Ubuntu,它看起來像這樣:

    重擊殼

  2. 創建一個目錄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>
  3. 儘管將使用VS Code編輯源代碼,但是您將使用g ++編譯器在Linux上編譯源代碼。您還將使用GDB在Linux上進行調試。這些工具默認未在Ubuntu上安裝,因此您必須安裝它們。幸運的是,該任務非常簡單!

  4. 在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以下載系統軟件包的最新版本,但這可能會花費更長的時間,具體取決於您的連接速度。

  5. 在命令提示符下,鍵入以下命令來安裝GNU編譯器工具和GDB調試器:

    <span style="color:#333333"><code><span style="color:#000000">sudo apt-get install build-essential gdb</span></code></span>
  6. 通過找到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中的文件資源管理器

您還可以從狀態欄中告訴遠程上下文。

狀態欄中的遠程上下文

如果單擊“遠程狀態”欄項目,將看到適合該會話的“遠程”命令的下拉列表。例如,如果要結束在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 / C ++擴展的安裝。

如果您已經在VS Code中本地安裝了C / C ++語言擴展,則需要轉到“擴展”視圖(Ctrl + Shift + X)並將這些擴展安裝到WSL中。通過選擇“ 在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對象的類型信息的窗口:

語句完成IntelliSense

您可以按Tab鍵插入選定的成員。然後,當您添加左括號時,您將看到有關該函數所需的任何參數的信息。

編譯helloworld.cpp

接下來,您將創建一個tasks.json文件來告訴VS Code如何構建(編譯)程序。該任務將在WSL上調用g ++編譯器,以基於源代碼創建可執行文件。

在主菜單中,選擇Terminal > Configure Default Build Task。在下拉列表中,將顯示任務下拉列表,其中列出了C ++編譯器的各種預定義構建任務。選擇g ++ build active file,它將構建當前在編輯器中顯示(活動)的文件。

任務C ++構建下拉列表

這將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": truegroup指定當您按Ctrl + Shift + B時將運行此任務。此屬性僅出於方便起見;如果將其設置爲false,您仍然可以從“終端”菜單中使用“ 任務:運行構建任務”來運行它。

運行構建

  1. 回到helloworld.cpp。您的任務將生成活動文件,並且您要生成helloworld.cpp

  2. 要運行中定義的構建任務tasks.json,請按Ctrl + Shift + B或從“ 終端”主菜單中選擇“ 任務:運行構建任務”

  3. 任務啓動時,您應該看到“集成終端”面板出現在源代碼編輯器下方。任務完成後,終端將顯示編譯器的輸出,指示構建成功還是失敗。對於成功的g ++構建,輸出看起來像這樣:

    G ++在終端中構建輸出

  4. 使用+按鈕創建一個新終端,您將在WSL上下文中運行一個bash終端,並將helloworld文件夾作爲工作目錄。運行ls,您現在應該看到可執行文件helloworld(沒有文件擴展名)。

    WSL bash終端

  5. 您可以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 ++構建並調試活動文件

C ++調試配置下拉列表

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在啓動調試時在該方法上停止。

其餘步驟作爲可選練習提供,以幫助您熟悉編輯和調試經驗。

開始調試會話

  1. 返回到helloworld.cpp它是活動文件。
  2. F5或從主菜單中選擇“運行”>“開始調試”。在開始逐步執​​行代碼之前,讓我們花一點時間注意用戶界面中的一些更改:
  • 集成終端出現在源代碼編輯器的底部。在“ 調試輸出”選項卡中,您將看到指示調試器已啓動並正在運行的輸出。

  • 編輯器突出顯示方法中的第一條語句main。這是C ++擴展自動爲您設置的斷點:

    初始斷點

  • 左側的“運行”視圖顯示調試信息。您將在本教程的後面看到一個示例。

  • 在代碼編輯器的頂部,將顯示一個調試控制面板。您可以通過抓住左側的點在屏幕上移動它。

    調試控件

單步執行代碼

現在,您準備開始逐步執​​行代碼。

  1. 單擊或按調試控制面板中的“ 跳過”圖標。

    跳過按鈕

    這會將程序執行推進到for循環的第一行,並跳過在創建和初始化變量時調用的vectorstring類內的所有內部函數調用msg。注意左側“ 變量”窗口中的更改。

    調試窗口

    在這種情況下,將出現錯誤,因爲儘管調試器現在可以看到循環的變量名,但該語句尚未執行,因此此時無任何內容可讀取。的內容msg是可見的,但是,因爲該聲明已完成。

  2. 再次按Step over前進到該程序中的下一條語句(跳過爲初始化循環而執行的所有內部代碼)。現在,“ 變量”窗口顯示有關循環變量的信息。

  3. 再次按Step over執行cout語句。(請注意,自2019年3月發行版起,直到循環退出,C ++擴展才將任何輸出輸出到調試控制檯。)

  4. 如果願意,可以繼續按Step over,直到將引導程序中的所有單詞都打印到控制檯爲止。但是,如果您感到好奇,請嘗試按“ 跳入”按鈕以逐步瀏覽C ++標準庫中的源代碼!

    gcc標準庫標頭中的斷點

    要返回自己的代碼,一種方法是按住“ 跳過”。另一種方法是在代碼中設置斷點,方法是切換到helloworld.cpp代碼編輯器中的選項卡,將插入點放在cout循環內語句上的某個位置,然後按F9。在左側的裝訂線中出現一個紅點,指示已在此行上設置斷點。

    主斷點

    然後按F5鍵從標準庫標題中的當前行開始執行。執行將中斷cout。如果願意,可以再次按F9鍵以關閉斷點。

    循環完成後,您可以在集成終端的“ 調試控制檯”選項卡中看到輸出,以及GDB輸出的一些其他診斷信息。

    調試控制檯顯示

設置手錶

有時,您可能希望在程序執行時跟蹤變量的值。您可以通過在變量上設置監視來做到這一點。

  1. 將插入點放在循環內。在“ 監視”窗口中,單擊加號,然後在文本框中鍵入word,這是循環變量的名稱。現在,當您逐步執行循環時,請查看“監視”窗口。

    觀察窗

  2. 通過在循環之前添加此語句來添加另一隻手錶int i = 0;。然後,在循環中,加上這樣一句話:++i;。現在,i像上一步一樣添加手錶。

  3. 要在斷點處暫停執行時快速查看任何變量的值,可以使用鼠標指針懸停在其上。

    鼠標懸停

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會話。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章