VScode开发调试C/C++

主要讲如何在 vscode 上实现编译 / 运行 / 调试 C 以及 C++,如果是初学者,就请完全按照文章的步骤进行。

Windows

一、前期准备

首先在微软官网下载并安装好visual stdio code,建议在安装时将选项全勾选上

1-安装.jpg

勾选后在文件和文件夹的右键菜单中会多出 Open with Code这个选项,也就是用 vscode 打开当前文件 / 文件夹

因为 vscode 只是一个代码编辑器,没有自带有 C/C++ 的编译器,因此首先需要安装一个 C/C++ 编译器并且设置环境变量,这里使用 mingw-w64。因为网络问题 mingw-w64 很难下载,建议离线下载然后手动添加环境变量

1
2
3
4
5
6
7
离线下载地址:
https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/
往下拉,
找到 MinGW-W64 GCC-8.1.0
下载 x86_64-win32-seh
建议安装位置在: D:\Program Files 
环境变量选择path双击,新建 D:\Program Files\mingw64\bin

此时我们要验证一下 mingw 是否可用,打开 cmd 输入 gcc -v,出现版本信息就表明 mingw 是可用的,如果未出现版本信息则需要再检查一下,如果这里出现问题,后面全部无法进行

2-gccv.png

  1. 安装必要的插件,打开 vscode,点击左面竖排第五个按钮,搜索并安装上如下三个插件
  • chinese(simplified)
  • C/C++
  • Code Runner

安装好以后重启一下 vscode,界面切换为中文,为了避免麻烦,暂时不要安装其他插件

二、配置环境

安装 Code Runner(非必要)

然后依次打开:文件 > 首选项 > 设置 > 用户 > 拓展 > Run Code Configuration
找到Run In Terminal勾选上

3-Run In Terminal.jpg

现在程序已经可以正常运行了,此时程序是运行在 vscode 的集成终端上,并不会额外弹出一个外部窗口

4-del.jpg

点击右上角的垃圾桶图标可以直接结束程序运行并关闭集成终端

配置 c_cpp_properties.json

在 vscode 资源管理器点击新建文件夹图标新建一个.vscode文件夹(注意前面的 “.” 号)。将三个json配置文件放进去。

打开 cmd 输入 gcc -v -E -x c++ - 可以获取C/C++ 头文件的位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
    "configurations": [
        {
            "name": "Win32",
            //"compilerPath": "D:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Tools/MSVC/14.32.31326/bin/Hostx64/x64/cl.exe",
            "includePath": [
	      "D:/Program Files/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++",
                "D:/Program Files/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/x86_64-w64-mingw32",
                "D:/Program Files/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/backward",
                "D:/Program Files/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include",
                "D:/Program Files/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include-fixed",
                "D:/Program Files/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/include"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "intelliSenseMode": "gcc-x64"
            //"intelliSenseMode": "windows-msvc-x64"
        }
    ],
    "version": 4
}

7-lujingcuowu.png

如果PC安装了VS,则根据提示修改 intelliSenseModewindows-msvc-x64 然后需要添加一行 “compilerPath”: “D:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Tools/MSVC/14.32.31326/bin/Hostx64/x64/cl.exe”,

配置 launch.json 和 tasks.json

launch.json里面的preLaunchTasktasks.jsoncommand 配置为gcc时可以编译c语言,配置为g++时可编译c++

如果是多文件编译(即函数声明和函数定义分开,不懂的别乱改),需要将 args 列表中的"${file}"项修改为"${workspaceFolder}/*.cpp" ,多文件推荐用 cmake

launch.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "targetArchitecture": "x64",
            "program": "${workspaceFolder}/${fileBasenameNoExtension}.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "D:/Program Files/mingw64/bin/gdb.exe",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "gcc"
        }
    ]
}

集成终端在底部终端栏输入数据,如果是希望像 vs2019 一样,启动调试后显示外部窗口而不是在 vscode 集成终端进行调试 只需将launch.json中的externalConsole后面的值由 false 改为 true

tasks.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "command": "gcc",
    //gcc 编译条件
    //gcc gdb-sample.c -o gdb-sample -g
    "args": [
        "${file}",
        "-o",
        "${fileDirname}/${fileBasenameNoExtension}",
        "-g",
    ],
}

测试一下

新建一个.cpp文件将下面的代码粘贴进去,并在适当的地方添加上断点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <bits/stdc++.h>
using namespace std;

void quicksort(int A[],int l,int r){
    int m=l;
    for(int i=l;i<r;i++){
        if(A[i]<A[r]){
            swap(A[i],A[m]);
            ++m;
        }
    }
    swap(A[m],A[r]);
    if(m>l+1)quicksort(A,l,m-1);
    if(m<r-1)quicksort(A,m+1,r);
}

int main(){
    int A[10];
    for(int i=0;i<10;i++) A[i]=10-i;
    for(int i=0;i<10;i++) cout<<A[i]<<' ';
    cout<<endl;
    quicksort(A,0,10-1);
    for(int i=0;i<10;i++) cout<<A[i]<<' ';
}

如果出现 未定义标识符 “xxx” 的错误,需要进 首选项-设置-扩展-c/c++-C_Cpp: Intelli Sense Engine 更改为第二项如图所示。 6-cppcuowu.png

f5 或者启动调试的按钮启动调试,程序执行到断点处会停下

5-vscode-tiaoshi.jpg

顶部六个按钮分别代表

  1. 继续执行到下一个断点处
  2. 执行下一条语句,遇到函数直接执行完不会跳转进函数
  3. 执行下一条语句,遇到函数会跳转进函数继续单步执行
  4. 跳出当前所在的函数,如果是主函数会结束程序
  5. 重新启动调试
  6. 结束调试

Ubuntu

一、前期准备

  1. 接着上 M$ 传送门:VScode

VScode

  1. 因为 vscode 只是一个代码编辑器,没有自带有 C/C++ 的编译器,因此我们需要安装一个 C/C++ 编译器,打开终端依次输入,确保安装好 gcc/g++ 和 gdb
1
2
3
4
5
6
7
8
sudo apt-get update
[有密码则输入密码]
sudo apt-get install gcc
[有密码则输入密码]
sudo apt-get install g++
[有密码则输入密码]
sudo apt-get install gdb
[有密码则输入密码]
  1. 安装必要的插件,打开 vscode,点击左面竖排第五个按钮,搜索并安装上如下两个插件
  • C/C++
  • Code Runner

coderunner

为了方便使用 , 可以在扩展—Run Code configuration- 的Code-runner: Run In Terminal和Code-runner: Save File Before Run两个选项前面打上勾。

Run Code configuration

安装好以后重启一下 vscode,为避免出现其他问题,先暂时不要安装其他插件界面给你推荐的插件

二、编译运行程序

点击:文件 > 新建文件,出现一个空白文档,我准备了一段测试用的代码,请复制粘贴到空白文档中

1
2
3
4
5
6
7
#include <stdio.h>
int main(){
    char name[100];
    printf("What is your name?\n");
    scanf("%s",name);
    printf("Hello,%s,nice to meet you!\n",name);
}

然后按 Ctrl+S 并将文件后缀名改为.c.cpp后保存到电脑上,然后点击右上角的三角形按钮(原本这个位置没有,是安装 Code Runner 插件后新增的一键编译运行程序的按钮),或者按 Ctrl+Alt+N 就能编译运行当前程序。

同时可以按 ctrl+~ 打开集成终端在其中输入命令行指令来编译运行

三、配置调试环境

首先在电脑上你习惯的位置新建一个文件夹,用于存放编写的代码,接下来配置好的调试环境,仅会对存放在这一个文件夹以及文件夹的子目录里程序生效!

新建好文件夹后,在 vscode 界面,点击:文件 > 打开文件夹,打开刚刚新建的文件夹(我的文件夹名叫 CODE)

再点击新建文件夹在打开的文件夹下新建一个 .vscode文件夹(注意前面的 “.” 号)

然后在. vscode 文件夹下新建两个 json 文件分别叫做

  • launch.json
  • tasks.json

然后将下面的代码复制到对应的 json 文件中去并保存

launch.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "C/C++",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "preLaunchTask": "compile",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

tasks.json

如果需要是c语言也就是gcc将下面的command项由g++改为gcc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
    "version": "2.0.0",
    "tasks": [{
            "label": "compile",
            "command": "g++",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "problemMatcher": {
                "owner": "cpp",
                "fileLocation": [
                    "relative",
                    "${workspaceRoot}"
                ],
                "pattern": {
                    "regexp": "^(.*):(\d+):(\d+):\s+(warning|error):\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            },
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

事实上现在已经可以正常调试了

并且此时可以按 ctrl+shift+b 直接调用配置好的 g++ task 编译程序而不运行程序,类似于一些 IDE 的编译选项