[翻譯]官網文檔,ubuntu使用vscode調試c++


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為此教程提問。

前提條件

為了成功地完成此向導,你必須做下面幾項工作:

  1. 安裝VS code
  2. 安裝Remote - WSL extension
  3. 安裝Windows Subsystem for Linux,然后在頁面鏈接上安裝你選擇的Linux發行版本。此教程使用Ubuntu。安裝時務必記住你的Linux用戶密碼,因為在安裝其他軟件時需要它。

設置你的Linux環境

  1. 打開WSL的Bash終端。如果你安裝了一個Ubuntu發行版,在Windows搜索欄搜索“Ubuntu”然后在結果列表中點擊它。對於Debian發行版,搜索“Debian”一樣。

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

  1. 創建一個目錄projects,然后在其中創建子目錄helloworld:
mkdir projects
cd projects
mkdir helloworld
  1. 你將會在Linux系統用VS code編輯源代碼,也會用g++編譯器編譯代碼。同時,你也會在Linux中用GDB進行調試。這些工具在Ubuntu中默認不安裝,所以你要親自安裝它們。幸運的是,這些工作很簡單!

  2. 在WSL的命令提示符中,先運行apt-get update來更新Ubuntu的包列表。過時的版本有時會干擾新軟件包的安裝。

sudo apt-get update

你也可以執行sudo apt-get update && sudo apt-get dist-upgrade指令,下載最新版本的系統包,但是這會因為網絡連接速度的約束而花費更多時間。

  1. 在命令行中安裝GNU編譯工具和GDB調試工具,命令如下:
sudo apt-get install build-essential gdb
  1. 通過定位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,你仍然可以在終端菜單中用運行生成任務來運行。

運行編譯

  1. 返回helloworld.cpp。你將編譯helloworld.cpp

  2. Ctrl+Shift+B或者在終端主菜單中選擇運行生成任務,運行定義在tasks.json文件的編譯任務。

  3. 任務開始時,源代碼編輯框下面會出現終端面板。編譯完成后,終端會輸出編譯是否成功的相關信息。編譯成功的樣子像這樣:

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

  1. 在終端輸入./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函數位置。

剩下的步驟時可選聯系,可以幫助你熟悉編輯和調試。

開始調試會話

  1. 返回helloworld.cpp,這是目前的目標文件。

  2. F5或主菜單選擇運行 > 啟動調試。在單步調試之前,我們用一分鍾來了解一下用戶界面的改變:

  • 代碼編輯框下面出現終端。在調試控制台標簽中,你可以看到調試器開始運行的輸出信息。
  • 編輯器在main函數的第一行高亮顯示。這是C++默認為你設置的斷點:

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

單步調試代碼

現在你可以准備開始單步調試代碼了。

  1. 在調試控制面板上點擊Step over圖表。

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

這個例子中,理應會出現問題,雖然變量名對循環來說是可見的,但是還沒有執行到,所以這一步沒有內容可以讀。msg變量可以看到,因為那條語句已經完成了。

  1. 再次按Step over讓程序執行到下一個聲明(跳過所有初始化循環的內部代碼)。現在,變量窗口會展示循環中的變量信息。

  2. 再按Step over執行到cout語句。(注意,在2019年3月發行的VS code中,C++擴展在循環結束前不會在調試控制台輸出任何信息。)

  3. 你可以一直按Step over直到向量中的所有單詞都打印出來。如果你對Step Into按鈕很好奇,可以點擊它試一試,這會跳到C++標准庫代碼的內部!

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

然后按F5在標准庫中開始執行,程序會停在cout語句的位置。以可以再次按F9取消斷點。

循環結束后,在調試控制台可以看到輸出信息,同時還有GDB的其他調試信息。

設置監視器

有時,你可能想在程序執行時跟蹤變量的值。你可以為變量設置監聽實現這一功能。

  1. 把光標聚焦在循環中,在監視窗口點擊添加表達式然后輸入循環的變量word。接下來,在調試時看着監視窗口。

  1. 在循環前加int i = 0;語句,在循環中添加++i語句,同上一步添加i變量的監視。

  2. 執行到斷點時,如果想快速看到任何變量的值,你可以把鼠標停在它上面。

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選項指定要調試的程序。

之后就能編譯、調試了。調試前記得先編譯源文件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM