这篇文章起初是我看了一个B站的视频,作者讲述了如何在Ubuntu的 环境中通过使用vscode调试C/C++代码。
这个教程非常好,也非常推荐给大家,但是这个教程有一个局限性,就是他在他的公共号上写的教程非常简略,以至于我想再次看一遍,需要重新看一遍视频,非常低效,所以我打算根据这位大佬的视频教程,写一篇博客,这样方便自己,也方便大家。
当然大家在网上也会搜到和我标题差不多的教程,但是我都看了一遍,都挺狗的,写的非常简略,你按照他们的教程基本就学的一个寂寞。
不过这里面也有挺多坑的,一般不自己梳理一遍很容易出现问题。里面需要书写cmake的文件
在这次教程中,我也会写一下,一个简单的C++项目,通过这个项目,大体梳理一下,整个调试的流程.
Ubuntu上vscode调试C/C++代码
插件安装
进行C、C++项目的编译和调试。vscode上的插件必不可少。
目前,我用到的是,上面的这些。
简单的C++项目
首先看截图,
主要的文件结构也比较简单,主要就是include,src,CmakeLists.txt。
CmakeLists.txt主要功能就是通过cmake这个工具,将整个项目进行编译,然后方便我们后续的调试
CmakeLists.txt 文件书写
CmakeLists.txt里面的内容是
cmake_minimum_required(VERSION 3.0)
project(SOLIDERFIRE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
set(CMAKE_BUILD_TYPE Debug)
include_directories(${CMAKE_SOURCE_DIR}/include)
add_executable(my_cmake_exe main.cpp src/Gun.cpp src/Solider.cpp)
上面的内容简单直白。
my_cmake_exe
编译成功产生的可执行文件的名字。-
C
M
A
K
E
S
O
U
R
C
E
D
I
R
是
C
m
a
k
e
L
i
s
t
s
.
t
x
t
位
于
的
绝
对
路
径
除
此
之
外
,
我
们
还
可
以
给
这
个
文
件
加
入
其
他
的
优
化
选
项
,
以
及
配
置
参
数
一
般
的
就
是
‘
s
e
t
(
C
M
A
K
E
C
X
X
F
L
A
G
S
,
"
{CMAKE_SOURCE_DIR} 是CmakeLists.txt 位于的绝对路径 除此之外,我们还可以给这个文件加入其他的优化选项,以及配置参数 一般的就是 `set(CMAKE_CXX_FLAGS, "
CMAKESOURCEDIR是CmakeLists.txt位于的绝对路径除此之外,我们还可以给这个文件加入其他的优化选项,以及配置参数一般的就是‘set(CMAKECXXFLAGS,"{CMAKE_CXX_FLAGS} -g -O2 -Wall")
进行代码的优化,具体的当然也可以自行谷歌。(但是这种带优化的的编译选项会有一个问题,就是无法很好的调试) 在CmakeLists.txt中写入新的参数之后,需要重新执行
cmake …以及
make`对项目进行编译。
set(CMAKE_BUILD_TYPE Debug)
这个参数非常重要,表示整个项目是支持debug调试的。
注意,每次CmakeLists.txt文件更新之后,需要执行一下 make
进行重新的编译。
cmake 编译 以及 make生成可执行文件
cmake 编译
然后我们新建一个文件夹build
,然后在命令行中进入build
文件夹,执行 cmake ..
这样新生成的文件都会放在build
文件夹之下了。
执行完cmake ..
命令之后的文件目录:
可以看到生成了Makefile
文件。这就是我们想要的。
make生成可执行文件
然后继续在build
文件夹之下执行,make
命令
可以看到这样,我们就生成了可执行程序my_cmake_exe
再看一下我们的文件目录:
然后需要注意的是,当你下次修改了项目中的某个文件之后,还需要执行make
重新进行编译,同时这个命令也只会编译其中被修改过的文件,其他文件不会被编译。
launch.json文件书写
前面的两个小的章节是对整个项目进行编译,然后产生可执行程序,然后运行整个项目的结果。
点击左边栏目上,虫子和三角的符号就会出来这个界面,然后点击create a lauch.json
按钮。
就会出来lauch.json
这个文件,对这个文件进行编辑。
然后我们需要对两个最重要的参数进行编辑:
"program": "${workspaceFolder}/build/my_cmake_exe",
"preLaunchTask": "C/C++: g++ build active file",
第一个参数就是说,我通过cmake生成的可执行文件的位置,${workspaceFolder}
代表整个项目的绝对路径。
task.json文件书写
在lauch.json
中设置的"preLaunchTask": "C/C++: g++ build active file",
就是为task.json
服务的。
我们在菜单栏中依次选择terminal
-> Configure Default Build task
设置task.json
文件。
然后就有朋友问了,这个突如其来的task.json
文件是干嘛的呢?
其实这个文件是将我们之前的两个操作(cmake .. 以及 make
)自动化实现起来的。
其中下面的截图中:
label
:代表任务名command
:代表我们执行的命令args
: 代表执行命令跟的参数。
tasks
下面有三个大括号,两个是 我们自定义的任务,还有一个是将这两个任务串联起来的命令,还有一个是开头的cwd
命令,是指我们进行下面这些脚本操作的文件路径的位置。
好了,现在大家还记得我们在launch.json
里面的"preLaunchTask": "C/C++: g++ build active file"
参数吗?
这个参数意思就是,我们在执行lauch.json
之前需要执行的操作是什么。
我现在将之修改为"preLaunchTask": "Build
. 这个Build
的来源是task.json
中第三个大括号的label
名。
{
"label": "Build",
"dependsOrder": "sequence", // 按列出的顺序执行任务依赖项
"dependsOn":[
"cmake",
"make"
]
}