linux上的vs code的C++環境搭建
最近練習leetcode程式設計,我希望在manjaro系統的vs code上可以單步除錯C++程式碼,找了很多資料都不能正常執行,所以參考官方資料自己整好了,記錄一下。
預置條件
首先完成如下工作
-
安裝vs code;
-
安裝外掛,如下圖所示
-
確認linux系統已經正確安裝gcc,輸入如下命令
gcc -v # 檢視gcc版本 sudo pacman -S build-essential gdb # 安裝必要工具軟體
建立Hello world工程
在本地建立目錄,我在本地建立了leetcode的目錄,所以有如下的步驟
mkdir project cd project mkdir cd helloworld code . # 在當前目錄下開啟vs code,當前開啟的資料夾就是這個“工作空間”
閱讀完本部落格之後,你會在當前的目錄下面建立下面的3個檔案
tasks.json
(compiler build settings)launch.json
(debugger settings)
新增原始檔
如圖所示,新增新的原始檔helloworld.cpp
在該檔案中貼上如下的原始碼
#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; }
然後儲存該檔案。
構建helloworld.cpp
接下來,你將建立一個task.json
檔案告訴VS code如何構建(編譯)當前的程式。這將觸發g++編譯器按照原始碼建立一個可執行程式。在主選單選擇終端->配置預設生成任務,然後在下拉選單選擇g++ build active file,如下圖所示
你將在.vscode
資料夾下面看到tasks.json
檔案,我們進一步編輯這個檔案
{ "version": "2.0.0", "tasks": [ { "type": "shell", "label": "C/C++: g++ build active file", "command": "/usr/bin/g++", "args": [ "-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}" ], "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true } } ] }
關於json檔案中變數的具體含義可以進一步參考Visual Studio Code Variables Reference
檔案中的指令指定了程式如何執行,當前檔案中的args
引數指定了傳輸給gcc的引數,這些引數必須按照編譯器期望的順序排列。
這個任務告訴g++將原始檔${file}
編譯,在當前資料夾下面建立可執行檔案helloword
,注意可執行檔案的名稱和原始檔相同,但是去掉了擴充套件字尾名。label
欄位表示你能看到的任務列表,你可以寫成任何你想寫的東西。group
中的"isDefault": true
表示你可以使用Ctrl+Shift+B
執行該任務,這個僅僅是為了使用上的方便,你依然可以通過選單中的選項執行該任務。
執行編譯程式
回到原來的helloworld.cpp
程式,按下Ctrl+Shift+B
執行該任務,請留意編輯器下方的終端的列印,在任務執行結束之後一般會提示成功或者失敗,如果執行順利,你可以看到如下的提示
如果留意可以看到當前的資料夾中已經生成了可執行程式helloworld
檔案,開啟新的終端,即可執行該程式
./helloworld # 執行可執行程式
修改tasks.json
你可以修改這個檔案中的引數,比如將${workspaceFolder}/*.cpp
替換${file}
,或者也可以將${fileDirname}/${fileBasenameNoExtension}
替換成一個硬編碼的程式名稱helloworld.out
。
除錯源程式
接下來你將建立launch.json
檔案,當按下F5
的時候VS Code呼叫GDB的偵錯程式用於除錯程式。找到選單中的執行 > 新增配置,然後選擇C++ (GDB/LLDB),如下圖所示
我們選擇g++ build and debug active file,你可以看到此處VS Code自動建立了檔案launch.json
檔案,檔案的內容如下
{
// 使用 IntelliSense 瞭解相關屬性。
// 懸停以檢視現有屬性的描述。
// 欲瞭解更多資訊,請訪問: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "g++ - 生成和除錯活動檔案",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "為 gdb 啟用整齊列印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++ build active file",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
很明顯在這個檔案中program
指定了需要debug的程式,和之前的檔案一樣,此處就是沒有後綴名的與原始檔一樣的程式,這個例子中就是helloworld
。預設情況下,C++外掛不會在程式碼中插入任何斷點,所以stopAtEntry
是false
。如果將該項改為true
,那麼就可以讓偵錯程式停在主函式的斷點處。
開始除錯
回到原始檔,按下F5
就可以開始除錯了,在程式碼編輯器的上訪可以看到除錯的控制條,包括了單步除錯,跳過除錯,重啟除錯和停止除錯的功能。稍微探索一下就可以發現,F9
是新增斷點,其他的除錯方法滑鼠懸停在上面都會顯示快捷鍵,你看到的編輯器應該是這樣的
除錯中可以看到每個變數的值,以及監視視窗。
需要注意的是,當前的版本(2019年3月份之後)不會在單步除錯模式下將cout的結果打印出來,只有程式執行完成之後才會統一打印出來。