作者:__lifanxin
鏈接:https://blog.csdn.net/A951860555/article/details/109175215
來源:CSDN
著作權歸作者所有,任何形式的轉載都請聯(lián)系作者。
說在前面
??本文是從官方文檔以及實際操作中總結而來,對于從事該行業(yè)的專業(yè)人員來說,推薦多看官方英文文檔;當然對于初學者而言,先行閱讀一個較好的中文指導博客也是無可厚非的。
正式起步
安裝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。
??接下來會出現(xiàn)vscode自帶的模板文件選項,是C就選擇
gcc.exe,是C++就選擇g++.exe。
??不同的系統(tǒng)展示會略有區(qū)別,如下是ubuntu系統(tǒng)所示,會展示詳細的compiler信息來幫助我們進行選擇。
??選中相應的模板文件后,會在當前目錄下生成.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完整配置
??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文件。
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)在就開始愉快的編程吧!