Vscode使用cmake进行debug的配置教学(教你学会写json配置)
误区
目前csdn上很多的cmake配置,无论是用插件还是写json,都不太方便,经常配置不成功。
比如想要运行slambook里的一些代码,用传统的配置方案都是建立在工作区就在本文件夹创建。
这样的缺点有:
- 每次切换工作区都要重新配置,麻烦
- 每次增加外部连接库都要用pkg去find路径,麻烦
- cmake会有一堆cache文件,导致reload操作很复杂
由此,这篇文章就介绍一种可以应用在整个大工作区的配置方案,而且可以diy设计
一、源代码和CmakeLists
1、源代码和c_cpp_properties.json
我们通常把vscode看成一个文本编辑器,一般而言不用作IDE,所以重点在 c_cpp_properties文件的配置中
所以如果不需要debug,可以只看这一章节,主要是用vscode的高亮和检查来方便写代码。
c_cpp_properties.json示例
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/usr/include/eigen3",
"/usr/include",
"/usr/local/include"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "gnu++14",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}
Ctrl+Shift+P搜索 c++编辑配置,生成c_cpp_properties.json
由于os的不同,自动生成的json可能不一样。
而我们只需要自己添加includePath就行
这个时候语法高亮就会打开,可以舒服地写代码了。
2、CMakeLists
CMakeLists的编写也是具有高亮的,需要下载插件Cmake
下载好了之后CMakeLists.txt 开启了高亮和联想。
注意:要在cmakelists里面开启DEBUG模式
set(CMAKE_BUILD_TYPE "Debug")
二、Cmake配置
1.Tasks.json
先自动生成默认的Tasks.json
然后进行修改
代码如下(示例):
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "shell",
"command": "rm -rf ${fileDirname}/build;mkdir ${fileDirname}/build;cd ${fileDirname}/build;cmake ..;make",
"args": []
}
]
}
“label”,给vscode的任务代号
“command”,这个相当于你不用IDE的时候用cmake的时候输入的代码
注意用;分隔代码,逐行执行指令。
我这里的命令是在源代码文件的地方创建一个build文件夹,然后执行cmake和make指令生成二进制文件
当然这里如果没有build文档就会报错,我们可以采取linux的
∣
∣
||
∣∣方式执行指令,或者直接在程序第一次执行前创建一个空的build。
这里如果采用g++,那就是其他文章里的相关配置,我这里由于采用的是cmake,所以链接和include指令都在cmakelists里面,arg可以不写。
可以看到我的二进制文件是生成在build里面的
2 . Launch.json配置
Launch.json的作用是告诉vscode调用DEBUG组件
配置代码如下(示例):
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 启动cmake",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/build/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"preLaunchTask": "build",
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
},
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"preLaunchTask": "build",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
代码的下面一部分是默认生成的,我们复制一份到上面
修改name,可以自己取便于辨认,我的是(gdb) 启动cmake
接下来是重要环节!
修改program: 路径指向上文生成的二进制文件所在路径
${fileDirname} //源代码所在文件夹
${fileBasenameNoExtension} //源代码同名文件(删除后缀)
我这里是${fileDirname}/build/${fileBasenameNoExtension}
prelaunchtask:是告诉vscode在执行二进制文件前需要的操作,我们应该把操作指向cmake生成时的tasks的label,我的是叫build。
最后给源代码打上断点,启动debug就可以正常步进了。
拓展
我这里的配置文件是在所有小工程的顶部
可以看到.vscode文件夹并不在源代码文件夹中
所以可以在每个chapter中使用,不用重新配置。