Deepin Linux 下用 vscode 调试 C/C++ 程序

1字数 1596阅读 7385

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

  1. vscode 在deepin上的应用商店里有下载,不过不一定最新,如果更新,去官网。
  2. 系统没有GDB,需要安装:sudo apt install gdb
  3. 没有 Xterm 终端,需要安装:sudo apt install XTerm
    (最新版的vscode,现在是2019年吧...,已经不用装这个了,自带的就可以。)

参考文献: 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
  1. 安装编译和调试的插件(点击插件 - 安装扩展) ,输入:ext install cpptools

  2. 从 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 中的内容。

    参考资料:

    linux下VSCODE编译调试C++流程

    ${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才能找到。

    参考资料:

    用GDB调试程序


用 Code Runner 编译运行 C/C++ 代码

  1. 配置好你的编译器路径,确保可以

    如何验证,在命令行输入,若有相关信息输出则说明已配置成功

    g++ -v
    
  2. 安装VSCode的插件Code Runner

  3. 修改Code Runner的一些设置以方便能够在命令行中使用

     "code-runner.runInTerminal": true,
     "code-runner.ignoreSelection": true,
     "code-runner.saveAllFilesBeforeRun": true,
    
  4. 编写代码并使用Code Runner ,编写完代码,右键-Run Code 或者按Ctrl+Alt+N

参考资料:

VSCode下便捷编译运行C++代码——Code Runner配置及说明


结语

我知道你看到这里,也许会有些许收获,但更多的是”好气“!没错,我写这篇文章的时候,就是带着”好气“的心情写的。为什么?因为我用 Google 搜索了半天的教程,大部分都是错误的,要不然就是很麻烦,不能通用,知其然不知其所以然,所以我写下这篇文章,希望这篇文章能成为中文版 vscode 相关问题教程的一股清流(泥石流) 。

我写这篇文章的时候,我的爱人就在旁边看着,对我说:”你这样气人,迟早是要被别人打的~“ ,哈哈,如果你真的感到好气,或者对我文章中的语气很不爽,那么我真诚地希望你能完善我这篇文章,这篇文章里还有很多缺陷
比如 :

  1. 两个 json 文件中的许多配置没有说明、加注释;
  2. 没有 Windows 和 MacOS 下的配置;
  3. workspaceRoot 和 workspaceFolder 两个变量有什么区别 ;
  4. 还有很多... ... 我就不打自己脸了;

希望你能多看官方文档,多去看外国佬的解决方法,我不是说外国的就怎么怎么好,毕竟,相比国内开发者,外国佬人更多,他们遇到的问题和解决问题的人更加庞大,高质量的博客也就更多,而国内的技术博客......???

Vscode官方参考资料:
C/C++ for VS Code (Preview)


推荐阅读更多精彩内容