環(huán)境準(zhǔn)備
- ubuntu 環(huán)境
- vscode安裝包 code_1.72.2-1665614327_amd64.deb
vscode 安裝和配置
安裝vscode:
sudo dpkg -i code_1.72.2-1665614327_amd64.deb
打開vscode安裝相關(guān)插件:
按ctrl+shift+x
開發(fā)擴展程序袍榆,安裝如下插件:
chinese
中文插件叶组,安裝完成后需要重啟生效c/c++
插件删顶,注意浓冒,這里默認(rèn)狀態(tài)的是最新版,需要點配置利朵,選擇安裝另一個版本
屁使,選擇1.8.4
版本,這個版本會自動生成launch.json
和tasks.json
兩個配置文件匆瓜,方便使用
image-20221026195311276.png
配置vscode赢笨,使能加載makefile進行編譯調(diào)試
測試代碼示意
目錄結(jié)構(gòu):
.
└── hello
├── hello.c
├── hello.h
├── main.c
└── makefile
main.c
#include <stdio.h>
#include "hello.h"
int main(void)
{
int a = 3;
printf("你好! %d\n", a);
for (int i = 0; i < a; ++i)
{
print_hello();
}
return 0;
}
hello.h
#ifndef _HELLO_H_
#define _HELLO_H_
int print_hello();
#endif
hello.c
#include <stdio.h>
#include "hello.h"
int print_hello()
{
printf("hello world\n");
return 0;
}
makefile
# 定義參數(shù), := 表示常量陕壹,不能在用 = 或 += 修改變量的值
TARGET = main
OBJ = main.o hello.o
CC := gcc
CFLAGS = -g -Wall
# 格式:
# 目標(biāo)文件 : 依賴文件
# 指令
#
# 說明:第一個目標(biāo)文件就我的最終目標(biāo)质欲。遞歸執(zhí)行子目標(biāo)
$(TARGET):$(OBJ)
# $^: 表示依賴項; $@:表示目標(biāo)項
$(CC) $(CFLAGS) $^ -o $@
%.o:%.c
$(CC) $(CFLAGS) -c $^ -o $@
# 偽目標(biāo): .PHONY: 只沒有依賴文件的目標(biāo)
.PHONY:
clean:
rm -rf $(TARGET) $(OBJ)
配置vscode
使用vscode打開代碼: 文件
-> 打開文件夾
-> 選擇hello目錄
打開 main.c
, 按F5
運行調(diào)試,選擇調(diào)試器 C++(GDB/LLDB)
,
image-20221026201731304.png
選擇配置gcc-9
(這里可以任意選一個)
image-20221026201908517.png
糠馆,選擇完成后嘶伟,會提示錯誤信息如下,不用管他又碌,點取消
就行九昧,這里主要是為了自動生成 launch.json
和 tasks.json
兩個默認(rèn)配置
image-20221026202225162.png
點取消后,會發(fā)現(xiàn)多了launch.json
和 tasks.json
兩個配置文件
image-20221026202501524.png
下邊主要是對這兩個文件進行修改毕匀。
修改tasks.json
铸鹰,使支持使用make
進行編譯
{
"tasks": [
{
"label": "build_debug", // 任務(wù)名稱,調(diào)試時可以指定不用任務(wù)進行處理
"type": "shell", // [shell, process], 定義任務(wù)作為作為進程運行還是在shell中作為命令運行; (測試沒看出啥區(qū)別...)
"command": "make", // 要執(zhí)行的命令皂岔,可以是外部程序或者是shell命令蹋笼。這里使用make編譯命令
"problemMatcher": [ // 要使用的問題匹配程序≡甓猓可以是一個字符串或一個問題匹配程序定義剖毯,也可以是一個字符串?dāng)?shù)組和多個問題匹配程序。
"$gcc"
],
"group": { // 定義此任務(wù)屬于的執(zhí)行組教馆。它支持 "build" 以將其添加到生成組逊谋,也支持 "test" 以將其添加到測試組。
"kind": "build",
"isDefault": true
},
"presentation": { // 配置用于顯示任務(wù)輸出并讀取其輸入的面板
"echo": true, // 控制是否將執(zhí)行的命令顯示到面板中土铺。默認(rèn)值為“true”胶滋。
"reveal": "always", // 控制運行任務(wù)的終端是否顯示”螅可按選項 "revealProblems" 進行替代究恤。默認(rèn)設(shè)置為“始終”。
"focus": false, // 控制面板是否獲取焦點后德。默認(rèn)值為“false”丁溅。如果設(shè)置為“true”,面板也會顯示探遵。
"panel": "shared", // 控制是否在任務(wù)間共享面板窟赏。同一個任務(wù)使用相同面板還是每次運行時新創(chuàng)建一個面板。
"showReuseMessage": true, // 控制是否顯示“終端將被任務(wù)重用箱季,按任意鍵關(guān)閉”提示
"clear": false // 運行前清屏
}
},
{
"label": "build_release",
"type": "shell",
"command": "make",
"args": ["CFLAGS = -O2"], // 編譯參數(shù), 替換makefile中讓CFLAGS字段
"dependsOn":["build_clean"], // 指定依賴讓task涯穷, 即會先執(zhí)行build_clean,然后再執(zhí)行build_release
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
}
},
{
"label": "build_clean",
"type": "shell",
"command": "make",
"args": ["clean"], // 相當(dāng)于執(zhí)行 make clean命令
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
}
}
],
"version": "2.0.0"
}
這里我們配置了3個任務(wù):
- build_debug: 調(diào)試模式藏雏,這里使用makefile的默認(rèn)配置拷况,makefile中的CFLAGS默認(rèn)有 -g 參數(shù),可以生成調(diào)試信息
- build_release: 生產(chǎn)模式掘殴,這里修改makefile中的 CFLAGS參數(shù)赚瘦,去掉了 -g -Wall選項,使用 -O2進行優(yōu)化
- build_clean: 刪除編譯產(chǎn)生的.o文件奏寨、目標(biāo)文件
這3個任務(wù)配置完成后起意,可以通過
ctrl+shift+b
進行選擇,手動選擇執(zhí)行哪一個
修改launch.json
, 配置調(diào)試需要的相關(guān)信息:程序名病瞳、以及默認(rèn)用哪個任務(wù)進行編譯等揽咕,具體如下
{
// 使用 IntelliSense 了解相關(guān)屬性。
// 懸停以查看現(xiàn)有屬性的描述套菜。
// 欲了解更多信息亲善,請訪問: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Lauch", // 啟動配置的下拉菜單中顯示的名稱
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/main", // 將要進行調(diào)試的程序的路徑, workspaceFolder指當(dāng)前工作目錄(即vscode打開的目錄:hello)逗柴,main指的是makefile編譯后目標(biāo)碼(可執(zhí)行程序)的名字
"args": [], // 程序啟動的參數(shù)
"stopAtEntry": false, // 設(shè)置true時蛹头,程序?qū)和T诔绦蛉肟谔? 即main()的第一個{位置
"cwd": "${workspaceFolder}", // 調(diào)試時的工作目錄
"environment": [],
"externalConsole": false, // 調(diào)試時,是否顯示控制臺串口
"MIMode": "gdb", // 調(diào)試命令
"setupCommands": [
{
"description": "為 gdb 啟用整齊打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "將反匯編風(fēng)格設(shè)置為 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "build_debug", // 使用哪個任務(wù)進行編譯戏溺,需要指定tasks.json中的一個渣蜗,這里選擇用build_debug任務(wù)進行編譯
"miDebuggerPath": "/usr/bin/gdb" // 調(diào)試命令的路徑
}
]
}
配置完成之后,可以按F5
進行調(diào)試