以前都是用的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的自定义功能远比我要想的强大