vscode: windows/linux下配置C/C++編譯和調試環(huán)境

作者:__lifanxin
鏈接:https://blog.csdn.net/A951860555/article/details/109175215
來源:CSDN
著作權歸作者所有,任何形式的轉載都請聯(lián)系作者。

說在前面

??本文是從官方文檔以及實際操作中總結而來,對于從事該行業(yè)的專業(yè)人員來說,推薦多看官方英文文檔;當然對于初學者而言,先行閱讀一個較好的中文指導博客也是無可厚非的。

鏈接: vscode C/C++環(huán)境配置官方文檔.

正式起步

安裝gcc組件

??windows下可以下載mingw-w64,關于mingw-w64的說明可以參見百度百科。而對于大多數(shù)linux系統(tǒng)而言,一般都自帶有gcc、g++的編譯環(huán)境,所有如果你正在使用常見的ubuntu系統(tǒng)、mac系統(tǒng)的話就不需要安裝。

添加環(huán)境變量

??這一步是需要windows用戶單獨操作的,也就是并不自帶gcc組件的系統(tǒng)。
??添加環(huán)境變量的步驟很簡單,首先找到正確的gcc組件所在的bin目錄,也就是說目錄路徑只能到bin為止,而不能明確到gcc,因為在bin目錄下不止有gcc,還有g++、gdb等程序。然后在win10系統(tǒng)中可以直接搜索環(huán)境變量,添加到系統(tǒng)變量或者用戶變量的path即中。
??在添加環(huán)境變量后,我們就可以在終端中直接輸入gcc --version等命令,如果顯示版本信息即可證明添加成功。這是因為本來在終端需要執(zhí)行一個命令就是在path環(huán)境變量中去查找該命令程序的所在目錄,一般系統(tǒng)都會自動配置一些程序路徑在這里,所以像自帶gcc組件的ubuntu和mac這些早已配置好了相應環(huán)境變量的系統(tǒng),不用配置也能在終端執(zhí)行相應命令。當然我們之所以需要在這里添加環(huán)境變量,只是為了方便后面vscode自動生成一些配置文件時可以找到gcc、g++的路徑。

創(chuàng)建helloworld項目

??下面我們開始用helloworld項目來完善我們的配置。
??新建一個test文件夾,在文件下新建hello.c或者hello.cpp,一個用于C語言,一個用于C++。接下來就是最關鍵的配置文件生成部分。

hello.c

#include <stdio.h>


int main(void)
{
    printf("hello, world\n");
    return 0;
}

hello.cpp

#include <iostream>


int main(void)
{
    using namespace std;
    
    cout << "hello, world!" << endl;
    return 0;
}

生成編譯配置文件

編譯配置-->tasks.json

??首先,選中.p或者.cpp文件,也就是一定要在vscode中打開相應的源代碼文件(否則不會出現(xiàn)如下第二張圖的模板文件選項),然后按照下圖一中進行操作,點擊Terminal-->Configure Tasks或者Configure Default Build Task。

創(chuàng)建tasks.json

??接下來會出現(xiàn)vscode自帶的模板文件選項,是C就選擇gcc.exe,是C++就選擇g++.exe。
C++編譯模板配置

??不同的系統(tǒng)展示會略有區(qū)別,如下是ubuntu系統(tǒng)所示,會展示詳細的compiler信息來幫助我們進行選擇。

ubuntu tasks.json

??選中相應的模板文件后,會在當前目錄下生成.vscode文件夾,里面會出現(xiàn)tasks.json文件,該文件即對應執(zhí)行程序編譯的配置文件,其內容如下:

windows下tasks.json

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "C/C++: g++.exe build active file",
            "command": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\bin\\g++.exe",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

ubuntu下tasks.json

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: 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
            },
            "detail": "compiler: /usr/bin/g++"
        }
    ]
}

關鍵鍵值名

??上面的兩個文件大同小異,對于json文件中的健我們可以直接在vscode中通過鼠標的懸停來進行了解,不過這里我們著重了解一些關鍵的健值就行了。

  • label
    ??可以理解為tasks這個健所對應數(shù)組中第一個配置對象的名字,也就是說我們還可以在此數(shù)組中配置第二個編譯指令,如下圖所示,注意label標簽名的不同且兩個配置之間有逗號隔開。所以如果你有在同一個項目中配置不同編譯的需要,就可以這樣配置。

以windows下tasks.json為例,其它系統(tǒng)也一樣

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "C/C++: g++.exe build active file",
            "command": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\bin\\g++.exe",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
        {
            "type": "shell",
            "label": "C/C++: NEW g++.exe build active file",
            "command": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\bin\\g++.exe",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}
  • command
    ??顧名思義就是編譯所需要的程序命令,如果之前配置好了環(huán)境變量,那么就會自動生成該路徑,否則需要自己手動配置。上圖中,windows的tasks.json中command是我自己電腦上的gcc路徑,而ubuntu使用自己的系統(tǒng)環(huán)境路徑/usr/bin/g++。注意linux系統(tǒng)中的程序沒有后綴名.exe。
    ??當然如果編譯C就使用gcc,編譯C++就使用g++,當然用gcc也可以編譯C++程序源代碼,不過需要加上鏈接庫-lstdc++,否則會報找不到C++特定庫中方法的錯誤。該參數(shù)需要添加在下面的args字段中。
  • args
    ??args字段實際上就是gcc、g++命令的參數(shù),也就是說如果通過終端使用gcc編譯C++源代碼文件,需要輸入gcc -g hello.c -o hello.exe -lstdc++-g表明啟用調試(然后可以在終端使用gdb進行調試,否則不行),-o是指定輸出文件的名字(否則自動為a.out),-lstdc++指明鏈接C++的庫(否則編譯報錯)。
    ??因此vscode就是把該終端命令分成了兩部分,command指明了所使用的程序,args指明了后面接的參數(shù)。當然vscode中使用了一些特定的標簽名,${file}代表在vscode中呈現(xiàn)在活動界面即當前打開且被選中的文件;"${fileDirname}\\${fileBasenameNoExtension}.exe${fileDirname}是一個變量名,代表被選中文件所在的文件夾,windows下用雙反斜杠\\隔開路徑(第一個反斜杠表示轉義,即雙反斜杠在json才代表一個\,\是windows路徑下的分隔符,否則在json中使用\會轉義字符$),然后${fileBasenameNoExtension}.exe表示使用被選中的文件名但不用其擴展名,然后以后綴.exe作為擴展名;而ubuntu下使用的是斜杠/分割路徑,并且沒有后綴名,當然在vscode還有更多的變量名,可以參考官方文檔:

鏈接:tasks.json和launch.json文件中的變量說明

tasks.json完整配置

??windows下tasks.json完整配置如下圖所示,ubuntu見上圖第一次給出的tasks.json文件:

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "C/C++: g++.exe build active file",
            // 使用自己電腦上的路徑
            "command": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\bin\\g++.exe",
            "args": [
                "-g",
                // 想編譯當前文件夾下所有.cpp文件可以這樣寫
                // "${fileDirname}\\*.cpp"
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

啟動編譯

??如下圖所示,點擊Terminal-->Run Build Task執(zhí)行默認的編譯選項(Run Task 會列出所有的編譯配置選項),此操作會使用我們之前配置好的tasks.json文件來對源代碼進行編譯,在windows下生成hello.exe文件,ubuntu下生成的程序則沒有后綴名。

啟動編譯

??至此,我們的C/C++的編譯環(huán)境已經配好,windows下在終端輸入./hello.exe,ubuntu下輸入./hello即可運行程序。下面進入調試環(huán)境的配置。

生成調試配置文件

調試配置-->launch.json

??同上面一樣,選中需要進行debug調試的文件,按照下圖所示點擊Run-->Add Configuration即可在.vscode文件夾下生成launch.json文件。

創(chuàng)建launch.json

windows下launch.json

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 啟動",
            "type": "cppdbg",
            "request": "launch",
            "program": "輸入程序名稱,例如 ${workspaceFolder}/a.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "/path/to/gdb",
            "setupCommands": [
                {
                    "description": "為 gdb 啟用整齊打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

ubuntu下launch.json

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "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": "C/C++: g++ build active file",
            "miDebuggerPath": "/bin/gdb"
        }
    ]
}

關鍵鍵值名

??如上圖所示,在ubuntu下可能已經自動生成好了完整的debug調試配置,如果沒有也沒關系,按照下面的操作進行就行。

  • name
    ??該json配置對象的名字。同樣也可以在此為launch.json配置多個debug調試對象,添加方式和tasks.json一樣,只需要把配置放在Configurations數(shù)組中,命名一個不同的name
  • program
    ??指明你需要調試的程序名,即上一步編譯生成的可執(zhí)行文件,該字段內的內容需要重新編寫,自動生成的內容已給出了示例:${workspaceFolder}\\a.exe。其中${workspaceFolder}表示在vscode中所打開的根文件夾,可以替換為${fileDirname}表示打開文件所在的文件夾;a.exe應該替換為自己需要調試的程序名,或者改為${fileBasenameNoExtension}.exe自動銜接上文tasks.json生成的程序名,這里還應當注意程序所在的目錄路徑是否相符合。注意ubuntu下使用/分隔路徑,程序名不加.exe后綴。
  • args
    ??args中是gdb命令所需要的參數(shù),一般不用寫,有特殊需要的可以在網上查找相關的資料。
  • MIMode
    ??指明調試所使用的程序,按照默認設置為gdb即可。
  • miDebuggerPath
    ??指明調試程序的路徑,在這里需要更改為自己的gdb路徑且要包括gdb.exe此程序名字,例如我的:C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\bin\\gdb.exe。ubuntu下為/usr/bin/gdb或者/bin/gdb。
  • preLaunchTask
    ??這個鍵值在上面windows自動生成的配置中并沒有出現(xiàn),需要自己配置一下(和上圖ubuntu中的配置一樣)。該鍵值的目的是指出在執(zhí)行debug調試之前需要執(zhí)行的tasks任務,也就是tasks.json下的某個編譯指令。在這里,我們將preLaunchTask鍵值設為C/C++: g++.exe build active file即對應我們之前配置好的tasks.json中的label標簽名,這樣一來我們在直接debug時就可以自動運行相應的編譯指令,而不用每次都要先編譯一下,然后再debug調試。

launch.json完整配置

??下面給出windows下完整的launch.json配置,ubuntu完整配置見上圖第一次給出的launch.json:

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 啟動",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}\\${fileBasenameNoExtension}.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            // 替換為自己電腦上的gdb路徑
            "miDebuggerPath": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\bin\\gdb.exe`",
            "setupCommands": [
                {
                    "description": "為 gdb 啟用整齊打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            // 要和tasks.json中的label標簽名對應
            "preLaunchTask": "C/C++: g++.exe build active file"
        }
    ]
}

啟動調試

??如下圖所示,點擊Run-->Start Debugging,即會按照launch.json文件配置來對相應的程序進行debug。


啟動調試

??在調試的時候給程序打好斷點,如下圖所示,我對代碼略微進行了修改,聲明了num變量,運行debug調試后,點擊有個蟲子(bug)樣式的圖標,然后在左側欄就可以看到變量的值。


斷點調試

結束語

??經過上面一番折騰,我們已經配置好C/C++程序的編譯和調試環(huán)境,當然如果需要在其它項目中應用相同的環(huán)境配置,可以直接復制.vscode到其它項目的根目錄下即可。那么,現(xiàn)在就開始愉快的編程吧!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容