我愿意化蝶在你肩上落
守住你不经意间的执着
–《化蝶》
1、背景
VSCode的task.json对于整个工程的编译配置十分不方便,比方说我要调用opencv库,我就得写一堆-L
来链接库文件,实际上这些工作cmake早就集成好了。但是我又想在vscode里面调试文件,那么如何结合CMake和gdb来进行调试呢?闲话少说,直接上代码:
2、task.json
{
"tasks": [
{
"type": "cmake",
"label": "CMake: build",
"command": "build",
"targets": [
"ALL_BUILD"
],
"group": "build",
"problemMatcher": [],
"detail": "CMake template build task"
}
],
"version": "2.0.0"
}
这个文件的作用就是,定义一个前置流程CMake: build
,只要点击调试调用gdb调试的时候,会先执行这个,也就是文件里面定义的cmake编译。当然啊,你CMake的生成器设置一定要设置成MinGW Makefiles
,可不要是vs studio,不然就贻笑大方了,不过想必查这个问题的读者应该不会有这样的错误。
vs输出为:
build task started....
E:\program-tools\cmake\bin\cmake.EXE --build e:/program/c++/txcl-final/build --config Debug --target all -j 18 --
[ 50%] Building CXX object CMakeFiles/test2.dir/matchtemple.cpp.obj
[100%] Linking CXX executable test2.exe
[100%] Built target test2
build finished successfully.
3、launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "gdb",
"preLaunchTask": "CMake: build",//调试前执行的任务,就是之前配置的tasks.json中的label字段
"type": "cppdbg",//配置类型,只能为cppdbg
"request": "launch",//请求配置类型,可以为launch(启动)或attach(附加)
"program": "${workspaceFolder}\\build\\test2.exe",//调试程序的路径名称,这个Debugger需要自己创建,为了方便放置生成的exe文件
"args": [],//调试传递参数
"stopAtEntry": true, // 设为true时程序将暂停在程序入口处,相当于在main上打断点
"cwd": "${workspaceFolder}", // 调试程序时的工作目录,此为工作区文件夹;改成${fileDirname}可变为文件所在目录
"environment": [
],
"externalConsole": false,//true显示外置的控制台窗口,false显示内置终端
"MIMode": "gdb",
"miDebuggerPath": "E:/lib/MinGW/mingw-posix/x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0/mingw64/bin/gdb.exe",// 调试器路径,Windows下后缀不能省略,Linux下则不要
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": false
}
]
}
]
}
说明:1、preLaunchTask
务必和task.json
里的label
一样,这个label
就像配置的函数名一样,以供调用。
2、program
标签就是你可执行文件的路径,这里其实可以换成cmake
插件提供的环境变量,但是我忘了,读者有兴趣可以查一下
3、miDebuggerPath
是gdb路径,也就是你MinGW的bin路径
我遇到的坑:如果你vscode中gdb调试启动之后窗口红了一下就闪退,并且没有错误提示,使用以下方法:
1、检查环境变量里面有没有其他的MinGW(装conda的时候会自动安装一个MinGW并且添加进环境变量里面,有conda环境的同学可以注意一下),如果有多个MinGW,请保证你编译工程使用的MinGW在环境变量列表中的最上面,否则调用的版本不对会导致无法启动调试,即使你在控制台里面可以启动gdb。
2、如果不是上面的问题,尝试直接在文件资源管理器,也就是文件夹里面双击鼠标执行可执行文件,看看有没有报错,我之前是因为运行找不到dll文件导致启动调试不成功,但是这个问题gdb和vscode是不会弹窗告诉你的,而是直接闪退,这一点真的很垃圾,所以需要你手动双击找到问题所在。