作者:__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)博客也是無可厚非的戳晌。
正式起步
安裝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凛虽。
??接下來會(huì)出現(xiàn)vscode自帶的模板文件選項(xiàng)死遭,是C就選擇
gcc.exe
,是C++就選擇g++.exe
凯旋。??不同的系統(tǒng)展示會(huì)略有區(qū)別呀潭,如下是ubuntu系統(tǒng)所示,會(huì)展示詳細(xì)的compiler信息來幫助我們進(jìn)行選擇至非。
??選中相應(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完整配置
??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下生成的程序則沒有后綴名淹魄。
??至此郁惜,我們的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文件半醉。
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。
??在調(diào)試的時(shí)候給程序打好斷點(diǎn)纫塌,如下圖所示诊县,我對(duì)代碼略微進(jìn)行了修改,聲明了num變量措左,運(yùn)行debug調(diào)試后依痊,點(diǎn)擊有個(gè)蟲子(bug)樣式的圖標(biāo),然后在左側(cè)欄就可以看到變量的值怎披。
結(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)在就開始愉快的編程吧鱼炒!