以前都是用的VScode调试c/cpp的单个文件的编译和执行, 但是一遇到大型项目一般就用gdb了, gdb的调试效率和VScode差距还是比较大的, 但最近发现VScode其实也能调试复杂的cpp项目, 所以记录一下.
首先明确一下几点:
- 首先cpp文件需要经过编译, 生成可执行文件, 然后通过运行/调试可执行文件达到我们想要的效果
- VScode中的task.json对应编译过程, launch.json对应调试过程
- VScode中的Code Runner插件只能运行, 不能调试, 配置在settings.json中, 和以上两个文件是相对独立, 互不影响的关系
我们的复杂C++项目当然不是通过单文件编译获得, 而是多个文件相互调用, 链接之后编译形成的, 最后会生成一个可执行文件, 假设为main, (我使用的是Ubuntu, 可执行文件没有后缀名)
项目简易结构为:
|--build
|--main
|--include
|--头文件
|--lib
|--依赖库
|--src
|--源代码
|--test
|--测试文件
运行
我们首先试着运行main, 建议使用VScode中的Code Runner插件, 基本上一家一个了, 不多说
打开它的插件主页往后翻, 就能看到的他的详细配置过程:
具体配置在settings中:
"code-runner.executorMap": {
"cpp": "cd $workspaceRoot/build && $workspaceRoot/build/main"
},
"code-runner.defaultLanguage": "cpp",
"code-runner.saveFileBeforeRun": true,
"code-runner.runInTerminal": false,
这个配置不太常规, 因为我们要运行的只有main文件, 所以我设置了无论当前文件在哪, 都默认运行main文件
这样项目点击右上角的三角形, 选择run code, 就能跑起来了
调试
调试的话, 我们只需要launch.json文件就行了, 因为一般编译过程比较复杂, 我假装已经编译好了, 那么我们就不需要task.json文件, launch.json文件中也不不需要"preLaunchTask"(调试前在编译一次)
我们的launch.json如下:
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/main", // 要调试的只有main文件
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
// "preLaunchTask": "build"
}
]
}
我们这个调试项目的名称叫"(gdb) Launch", 这样我们点击右上角的调试C/C++文件, 然后选择任务"(gdb) Launch", 就开始调试了!
VScode的自定义功能远比我要想的强大