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

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

說在前面

??本文是從官方文檔以及實(shí)際操作中總結(jié)而來,對(duì)于從事該行業(yè)的專業(yè)人員來說栅哀,推薦多看官方英文文檔震肮;當(dāng)然對(duì)于初學(xué)者而言,先行閱讀一個(gè)較好的中文指導(dǎo)博客也是無可厚非的戳晌。

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

正式起步

安裝gcc組件

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

添加環(huán)境變量

??這一步是需要windows用戶單獨(dú)操作的,也就是并不自帶gcc組件的系統(tǒng)侈询。
??添加環(huán)境變量的步驟很簡單舌涨,首先找到正確的gcc組件所在的bin目錄,也就是說目錄路徑只能到bin為止扔字,而不能明確到gcc囊嘉,因?yàn)樵赽in目錄下不止有g(shù)cc,還有g(shù)++革为、gdb等程序扭粱。然后在win10系統(tǒng)中可以直接搜索環(huán)境變量,添加到系統(tǒng)變量或者用戶變量的path即中震檩。
??在添加環(huán)境變量后琢蛤,我們就可以在終端中直接輸入gcc --version等命令,如果顯示版本信息即可證明添加成功抛虏。這是因?yàn)楸緛碓诮K端需要執(zhí)行一個(gè)命令就是在path環(huán)境變量中去查找該命令程序的所在目錄博其,一般系統(tǒng)都會(huì)自動(dòng)配置一些程序路徑在這里,所以像自帶gcc組件的ubuntu和mac這些早已配置好了相應(yīng)環(huán)境變量的系統(tǒng)嘉蕾,不用配置也能在終端執(zhí)行相應(yīng)命令贺奠。當(dāng)然我們之所以需要在這里添加環(huán)境變量霜旧,只是為了方便后面vscode自動(dòng)生成一些配置文件時(shí)可以找到gcc错忱、g++的路徑。

創(chuàng)建helloworld項(xiàng)目

??下面我們開始用helloworld項(xiàng)目來完善我們的配置挂据。
??新建一個(gè)test文件夾以清,在文件下新建hello.c或者hello.cpp,一個(gè)用于C語言崎逃,一個(gè)用于C++掷倔。接下來就是最關(guān)鍵的配置文件生成部分。

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中打開相應(yīng)的源代碼文件(否則不會(huì)出現(xiàn)如下第二張圖的模板文件選項(xiàng))浪汪,然后按照下圖一中進(jìn)行操作,點(diǎn)擊Terminal-->Configure Tasks或者Configure Default Build Task凛虽。

創(chuàng)建tasks.json

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

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

ubuntu tasks.json

??選中相應(yīng)的模板文件后钠署,會(huì)在當(dāng)前目錄下生成.vscode文件夾,里面會(huì)出現(xiàn)tasks.json文件荒椭,該文件即對(duì)應(yīng)執(zhí)行程序編譯的配置文件谐鼎,其內(nèi)容如下:

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++"
        }
    ]
}

關(guān)鍵鍵值名

??上面的兩個(gè)文件大同小異,對(duì)于json文件中的健我們可以直接在vscode中通過鼠標(biāo)的懸停來進(jìn)行了解趣惠,不過這里我們著重了解一些關(guān)鍵的健值就行了该面。

  • label
    ??可以理解為tasks這個(gè)健所對(duì)應(yīng)數(shù)組中第一個(gè)配置對(duì)象的名字,也就是說我們還可以在此數(shù)組中配置第二個(gè)編譯指令信卡,如下圖所示隔缀,注意label標(biāo)簽名的不同且兩個(gè)配置之間有逗號(hào)隔開。所以如果你有在同一個(gè)項(xiàng)目中配置不同編譯的需要傍菇,就可以這樣配置猾瘸。

以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)境變量牵触,那么就會(huì)自動(dòng)生成該路徑,否則需要自己手動(dòng)配置咐低。上圖中揽思,windows的tasks.json中command是我自己電腦上的gcc路徑,而ubuntu使用自己的系統(tǒng)環(huán)境路徑/usr/bin/g++见擦。注意linux系統(tǒng)中的程序沒有后綴名.exe钉汗。
    ??當(dāng)然如果編譯C就使用gcc,編譯C++就使用g++鲤屡,當(dāng)然用gcc也可以編譯C++程序源代碼损痰,不過需要加上鏈接庫-lstdc++,否則會(huì)報(bào)找不到C++特定庫中方法的錯(cuò)誤酒来。該參數(shù)需要添加在下面的args字段中卢未。
  • args
    ??args字段實(shí)際上就是gcc、g++命令的參數(shù),也就是說如果通過終端使用gcc編譯C++源代碼文件辽社,需要輸入gcc -g hello.c -o hello.exe -lstdc++伟墙,-g表明啟用調(diào)試(然后可以在終端使用gdb進(jìn)行調(diào)試,否則不行)滴铅,-o是指定輸出文件的名字(否則自動(dòng)為a.out)远荠,-lstdc++指明鏈接C++的庫(否則編譯報(bào)錯(cuò))。
    ??因此vscode就是把該終端命令分成了兩部分失息,command指明了所使用的程序譬淳,args指明了后面接的參數(shù)。當(dāng)然vscode中使用了一些特定的標(biāo)簽名盹兢,${file}代表在vscode中呈現(xiàn)在活動(dòng)界面即當(dāng)前打開且被選中的文件邻梆;"${fileDirname}\\${fileBasenameNoExtension}.exe${fileDirname}是一個(gè)變量名,代表被選中文件所在的文件夾绎秒,windows下用雙反斜杠\\隔開路徑(第一個(gè)反斜杠表示轉(zhuǎn)義浦妄,即雙反斜杠在json才代表一個(gè)\\是windows路徑下的分隔符见芹,否則在json中使用\會(huì)轉(zhuǎn)義字符$)剂娄,然后${fileBasenameNoExtension}.exe表示使用被選中的文件名但不用其擴(kuò)展名,然后以后綴.exe作為擴(kuò)展名玄呛;而ubuntu下使用的是斜杠/分割路徑阅懦,并且沒有后綴名,當(dāng)然在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",
                // 想編譯當(dāng)前文件夾下所有.cpp文件可以這樣寫
                // "${fileDirname}\\*.cpp"
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

啟動(dòng)編譯

??如下圖所示,點(diǎn)擊Terminal-->Run Build Task執(zhí)行默認(rèn)的編譯選項(xiàng)(Run Task 會(huì)列出所有的編譯配置選項(xiàng))惕它,此操作會(huì)使用我們之前配置好的tasks.json文件來對(duì)源代碼進(jìn)行編譯怕午,在windows下生成hello.exe文件,ubuntu下生成的程序則沒有后綴名淹魄。

啟動(dòng)編譯

??至此郁惜,我們的C/C++的編譯環(huán)境已經(jīng)配好,windows下在終端輸入./hello.exe甲锡,ubuntu下輸入./hello即可運(yùn)行程序兆蕉。下面進(jìn)入調(diào)試環(huán)境的配置。

生成調(diào)試配置文件

調(diào)試配置-->launch.json

??同上面一樣搔体,選中需要進(jìn)行debug調(diào)試的文件恨樟,按照下圖所示點(diǎn)擊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) 啟動(dòng)",
            "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"
        }
    ]
}

關(guān)鍵鍵值名

??如上圖所示,在ubuntu下可能已經(jīng)自動(dòng)生成好了完整的debug調(diào)試配置缩多,如果沒有也沒關(guān)系呆奕,按照下面的操作進(jìn)行就行养晋。

  • name
    ??該json配置對(duì)象的名字。同樣也可以在此為launch.json配置多個(gè)debug調(diào)試對(duì)象梁钾,添加方式和tasks.json一樣绳泉,只需要把配置放在Configurations數(shù)組中,命名一個(gè)不同的name姆泻。
  • program
    ??指明你需要調(diào)試的程序名零酪,即上一步編譯生成的可執(zhí)行文件,該字段內(nèi)的內(nèi)容需要重新編寫拇勃,自動(dòng)生成的內(nèi)容已給出了示例:${workspaceFolder}\\a.exe四苇。其中${workspaceFolder}表示在vscode中所打開的根文件夾,可以替換為${fileDirname}表示打開文件所在的文件夾方咆;a.exe應(yīng)該替換為自己需要調(diào)試的程序名月腋,或者改為${fileBasenameNoExtension}.exe自動(dòng)銜接上文tasks.json生成的程序名,這里還應(yīng)當(dāng)注意程序所在的目錄路徑是否相符合瓣赂。注意ubuntu下使用/分隔路徑榆骚,程序名不加.exe后綴。
  • args
    ??args中是gdb命令所需要的參數(shù)煌集,一般不用寫妓肢,有特殊需要的可以在網(wǎng)上查找相關(guān)的資料。
  • MIMode
    ??指明調(diào)試所使用的程序苫纤,按照默認(rèn)設(shè)置為gdb即可职恳。
  • miDebuggerPath
    ??指明調(diào)試程序的路徑,在這里需要更改為自己的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
    ??這個(gè)鍵值在上面windows自動(dòng)生成的配置中并沒有出現(xiàn)恭金,需要自己配置一下(和上圖ubuntu中的配置一樣)操禀。該鍵值的目的是指出在執(zhí)行debug調(diào)試之前需要執(zhí)行的tasks任務(wù),也就是tasks.json下的某個(gè)編譯指令横腿。在這里颓屑,我們將preLaunchTask鍵值設(shè)為C/C++: g++.exe build active file即對(duì)應(yīng)我們之前配置好的tasks.json中的label標(biāo)簽名,這樣一來我們在直接debug時(shí)就可以自動(dòng)運(yùn)行相應(yīng)的編譯指令耿焊,而不用每次都要先編譯一下揪惦,然后再debug調(diào)試。

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) 啟動(dòng)",
            "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標(biāo)簽名對(duì)應(yīng)
            "preLaunchTask": "C/C++: g++.exe build active file"
        }
    ]
}

啟動(dòng)調(diào)試

??如下圖所示器腋,點(diǎn)擊Run-->Start Debugging,即會(huì)按照launch.json文件配置來對(duì)相應(yīng)的程序進(jìn)行debug。


啟動(dòng)調(diào)試

??在調(diào)試的時(shí)候給程序打好斷點(diǎn)纫塌,如下圖所示诊县,我對(duì)代碼略微進(jìn)行了修改,聲明了num變量措左,運(yùn)行debug調(diào)試后依痊,點(diǎn)擊有個(gè)蟲子(bug)樣式的圖標(biāo),然后在左側(cè)欄就可以看到變量的值怎披。


斷點(diǎn)調(diào)試

結(jié)束語

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衔沼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子昔瞧,更是在濱河造成了極大的恐慌指蚁,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件自晰,死亡現(xiàn)場離奇詭異凝化,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)酬荞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門搓劫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人混巧,你說我怎么就攤上這事枪向。” “怎么了咧党?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵秘蛔,是天一觀的道長。 經(jīng)常有香客問我傍衡,道長深员,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任蛙埂,我火速辦了婚禮倦畅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绣的。我一直安慰自己叠赐,他們只是感情好欲账,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著燎悍,像睡著了一般敬惦。 火紅的嫁衣襯著肌膚如雪盼理。 梳的紋絲不亂的頭發(fā)上谈山,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音宏怔,去河邊找鬼奏路。 笑死,一個(gè)胖子當(dāng)著我的面吹牛臊诊,可吹牛的內(nèi)容都是我干的鸽粉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼抓艳,長吁一口氣:“原來是場噩夢啊……” “哼触机!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起玷或,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤儡首,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后偏友,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蔬胯,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年位他,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了氛濒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鹅髓,死狀恐怖舞竿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窿冯,我是刑警寧澤炬灭,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站靡菇,受9級(jí)特大地震影響重归,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜厦凤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一鼻吮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧较鼓,春花似錦椎木、人聲如沸违柏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽漱竖。三九已至,卻和暖如春畜伐,著一層夾襖步出監(jiān)牢的瞬間馍惹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工玛界, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留万矾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓慎框,卻偏偏與公主長得像良狈,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子笨枯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容