Deepin Linux 下用 vscode 调试 C/C++ 程序
现在网上的大部分类似博客都是错的、有问题的、麻烦的;
而你如果有幸读到我的这篇文章,那么恭喜你,我的是正确的,没问题的,简单的。
Deepin Linux 的问题
我的系统是:Deepin Linux 15.5 桌面版 ,但是和 Ubuntu,debian 系的 linux 系统都是类似的。
Linux xxx 4.14.0-deepin2-amd64 #1 SMP PREEMPT Deepin 4.14.12-2 (2018-01-06) x86_64 GNU/Linux
- vscode 在deepin上的应用商店里有下载,不过不一定最新,如果更新,去官网。
- 系统没有GDB,需要安装:sudo apt install gdb
- 没有 Xterm 终端,需要安装:sudo apt install XTerm
参考文献: Deepin Linux安装使用Visual Studio Code(VSCode)调试C++
Visual Studio Code 的问题
我的版本:(此时有更新了,我没有更新到1.21.1)
版本 1.21.0
提交 9a199d77c82fcb82f39c68bb33c614af01c111ba
日期 2018-03-07T11:01:43.521Z
Shell 1.7.9
渲染器 58.0.3029.110
Node 7.9.0
架构 x64
-
安装编译和调试的插件(点击插件 - 安装扩展) ,输入:ext install cpptools
-
从 vscode 的菜单栏上点击【打开文件夹】,选择你的 C/C++ 项目文件夹,进入程序,设置断点,F5调试,报错,没有配置,我们选择 C++(GDB) 调试,添加配置,然后,会在你的项目目录下,生成一个.vscode 文件夹, 里头有一个 launch.json , 先不管它, 在 vscode 的资源管理器中,右键 .vscode ,【新建文件】,名字为 tasks.json 。
launch.json
{ "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${workspaceRoot}/${fileBasenameNoExtension}.o", "args": [], "stopAtEntry": false, "cwd": "${workspaceRoot}", "environment": [], "externalConsole": true, "preLaunchTask": "build", "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ] } ] }
先看"cwd" : 这里是 "${workspaceRoot}" ,你如果搜索过相关专题,也许会注意到有两个 $变量, 一个是:
“${workspaceFolder}” , 另一个就是 "${workspaceRoot}" ,那么这两个有什么区别?我不清楚,如果你想了解,请去 issues page 上查, 这里我想说的是,当你用 【文件】——> 【打开文件夹】这种方式打开的时候,你当前的项目目录就是 "${workspaceRoot}" ;而你右键 vscode 资源管理器的项目文件夹,点击【复制路径】时,就是:"${workspaceFolder}" , 当然,也许你会发现没啥区别,但我希望你知道,啧啧啧,你知道吗?
再看"program": 这里是 "${workspaceRoot}/${fileBasenameNoExtension}.o" ,我们来谈谈 ${fileBasenameNoExtension} ,有些博客里是{file} ,但你很快就会发现,如果用 ${file} 变量,那么你生成的程序就是 name.cpp.o , 没错,NoExtension 就是去掉扩展名的意思,就这么简单。
最后看一下"preLaunchTask": 为什么我们要加这句话?因为我们调试,就需要生成供我们调试的文件,也就是说,调试前,我们要先执行 “build” 任务,(build 这个名字是我随便起的) ,而 build 任务就是 tasks.json 中的内容。
参考资料:
${workspaceRoot} in launch.json is not the Folder path
tasks.json
{ "version": "0.1.0", "showOutput": "always", "tasks": [ { "taskName": "build", "command": "g++", // C 语言就 gcc "isShellCommand": true, "showOutput": "always", "args": ["-g","${file}", "-o", "${workspaceRoot}/${fileBasenameNoExtension}.o"] // g++ 后面的命令参数 } ] }
其实已经没什么好说的了,主要就是 "command" 和 "args" ,如果你知道调试命令,那么就自己配置适合自己的调试方式,我这里的例子是:
# 生成 debug 文件程序 g++ -g server.cpp -o server.o # 抽象出来就是下面的这条命令: g++ -g ${file} -o ${workspaceRoot}/${fileBasenameNoExtension}.o
最后,注意到 “taskName” 中的 ”build“ , 要和 launch.json 中的 “preLaunchTask'' 中的名字对应上,这样vscode才能找到。
参考资料:
用 Code Runner 编译运行 C/C++ 代码
-
配置好你的编译器路径,确保可以
如何验证,在命令行输入,若有相关信息输出则说明已配置成功
g++ -v
-
安装VSCode的插件Code Runner
-
修改Code Runner的一些设置以方便能够在命令行中使用
"code-runner.runInTerminal": true, "code-runner.ignoreSelection": true, "code-runner.saveAllFilesBeforeRun": true,
-
编写代码并使用Code Runner ,编写完代码,右键-Run Code 或者按Ctrl+Alt+N
参考资料:
VSCode下便捷编译运行C++代码——Code Runner配置及说明
结语
我知道你看到这里,也许会有些许收获,但更多的是”好气“!没错,我写这篇文章的时候,就是带着”好气“的心情写的。为什么?因为我用 Google 搜索了半天的教程,大部分都是错误的,要不然就是很麻烦,不能通用,知其然不知其所以然,所以我写下这篇文章,希望这篇文章能成为中文版 vscode 相关问题教程的一股清流(泥石流) 。
我写这篇文章的时候,我的爱人就在旁边看着,对我说:”你这样气人,迟早是要被别人打的~“ ,哈哈,如果你真的感到好气,或者对我文章中的语气很不爽,那么我真诚地希望你能完善我这篇文章,这篇文章里还有很多缺陷,
比如 :
- 两个 json 文件中的许多配置没有说明、加注释;
- 没有 Windows 和 MacOS 下的配置;
- workspaceRoot 和 workspaceFolder 两个变量有什么区别 ;
- 还有很多... ... 我就不打自己脸了;
希望你能多看官方文档,多去看外国佬的解决方法,我不是说外国的就怎么怎么好,毕竟,相比国内开发者,外国佬人更多,他们遇到的问题和解决问题的人更加庞大,高质量的博客也就更多,而国内的技术博客......???
Vscode官方参考资料:
C/C++ for VS Code (Preview)
网友评论