1. 程式人生 > 實用技巧 >linux上的vs code的C++環境搭建

linux上的vs code的C++環境搭建

最近練習leetcode程式設計,我希望在manjaro系統的vs code上可以單步除錯C++程式碼,找了很多資料都不能正常執行,所以參考官方資料自己整好了,記錄一下。

預置條件

首先完成如下工作

  1. 安裝vs code;

  2. 安裝外掛,如下圖所示

  3. 確認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++外掛不會在程式碼中插入任何斷點,所以stopAtEntryfalse。如果將該項改為true,那麼就可以讓偵錯程式停在主函式的斷點處。

開始除錯

回到原始檔,按下F5就可以開始除錯了,在程式碼編輯器的上訪可以看到除錯的控制條,包括了單步除錯,跳過除錯,重啟除錯和停止除錯的功能。稍微探索一下就可以發現,F9是新增斷點,其他的除錯方法滑鼠懸停在上面都會顯示快捷鍵,你看到的編輯器應該是這樣的

除錯中可以看到每個變數的值,以及監視視窗。

需要注意的是,當前的版本(2019年3月份之後)不會在單步除錯模式下將cout的結果打印出來,只有程式執行完成之後才會統一打印出來。