Loading

VSCode配置 C++ 学习环境(多文件编译连接)

本文绝大部分内容来自:https://zhuanlan.zhihu.com/p/147366852,仅根据自身在 ubuntu 上的配置作了些许修改

如果是想了解下 vscode 的配置文件,或者 vscode 配置 c++学习环境,建议直接看原文,本文删了些基础步骤。

很多大学的计算机专业用的入门语言都是C语言,通常老师会给学生指定一款IDE来进行程序的编写,比如vc++6.0、Code::Blocks、Dev c++,可是这些IDE大都比较老旧,用起来有很多不顺畅的地方,而且界面粗糙,一点都没有印象中程序员该有的那种炫酷的感觉,所以寻找一款现代化的、功能强大的编辑器/IDE对于一些人来说还是很有必要的。

也许有人说这些IDE开箱即用,不需要额外配置,对于什么都还不了解的新人来说很合适。我认为这是有道理的,但不应当妨碍一个有好奇心和折腾欲的学生去尝试其他的编程工具,我个人认为爱折腾对计算机专业的学生来说是一项可贵的品质,折腾工具、搭建环境的过程中可以学到很多有用的东西,这是与计算机交流的过程,也是每一个进入代码世界的人的必经之路,只是要学会克制,不要把时间全花在折腾工具和环境上。

拥有一套自己精心配置的编程工具,可以帮助计算机新人更快地走进代码的世界,提高对编程、对学业的兴趣。

目前网上有大量的关于vscode的文章和教程,但我没有找到一篇细致的、面向小白的、搭建语言学习环境而非实际开发环境的教程,很多教程只是写了怎样配置,却没有写为什么要这样配置,我自己搞清楚其中种种后决定记录下来。

为什么是VSCode?

VSCode是微软出品的轻量级编辑器,定位是文本编辑器,开源,免费,海量插件,外观出色,简洁流畅,支持众多编程语言,支持三大操作系统Windows、Linux、MacOS。总之,这是一款足够强大和优雅的编辑器,你值得拥有。

与VScode(Visual Studio Code)名字相像的VS(Visual Studio)是微软的IDE,而VScode是编辑器,两者定位不同,一个蓝色一个紫色,不要搞混了。

本文文章内容主要是 win10环境,后续会加上 ubuntu 20.04 上 vscode 多文件编译的配置,mac os 可以参考思想。

本文以 C 为例,涉及到不同的地方有标注

让我们开始这场vscode的配置之旅

Step 0 基本概念

小白之所以是小白,就在于很多东西不知道、不了解、没见过、没用过,在你配置编程工具的过程中,你会遇到很多课本里没有、老师课上没说的东西、概念,这也是为什么很多人说配置vscode太麻烦了的原因,这种时候,善用搜索引擎,遇到不懂的东西、没见过的名词,上网查一下,大概了解一下是什么再接着往下看就行了。

在这篇文章中,我会尽量解释清楚每个对你来说可能陌生的东西,不过仍然有可能会有你不明白的地方,网上查一下就好。

最一开始,你应当了解如下概念:

  • 编程是怎样的一个过程:

    首先用文本编辑器编写源代码 -> 编译源代码 生成目标代码-> 将目标代码与其它代码(如库函数代码、标准启动代码)链接起来 -> 生成可执行代码

  • 区分编辑器、编译器、IDE:
    编辑器就是处理文本(源码)的程序,写代码写的就是文本,编辑器可能提供智能提示、代码高亮等辅助功能,但不负责源码到二进制文件的操作;

    编译器就是负责将源码文本翻译成计算机能够理解和执行的二进制文件的程序;

    集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,包括了代码编辑器、编译器、调试器和图形用户界面工具。集成了代码编写、分析、编译、调试等一整套工具链。

  • 什么是搭建环境:
    vscode定位代码编辑器,不是IDE,不包含编译功能,因此需要我们自己安装编译器、调试器等编译器套件,并使两者有效的配合起来,以实现快捷操作。把这一整套工具链整合到一起的过程就是我们所说的搭建环境。

    ok,到这里,我们就清楚要做什么了:获取编辑器 -> 获取编译套装(编译器、调试器、头文件库等) -> 做好两者之间的沟通工作(配置文件)

Step 1 下载安装

两个东西:编辑器和编译套装

编辑器就是我们的vscode了,到官网https://code.visualstudio.com/

下载安装:

双击打开下载好的程序进行安装,安装到默认位置或者你自定义的位置,安装过程中注意这个界面:

这几个选项建议全部勾上。

然后是编译套装

编译工具我们选用gcc(全称GNU Compiler Collection 意思是GNU编译器套件),不过不是原版的gcc,而是它在Windows下的特制版MinGW(全称Minimalist GNU on Windows)。它实际上是将GCC 移植到了 Windows 平台下,并且包含了 Win32API ,因此可以将源代码编译为可在 Windows 中运行的可执行程序。而且还可以使用一些 Windows 不具备的,Linux平台下的开发工具。MinGW又分为MinGW-w64 与 MinGW ,区别在于 MinGW 只能编译生成32位可执行程序,而 MinGW-w64 则可以编译生成 64位 或 32位 可执行程序。MinGW 现已被 MinGW-w64 所取代,且 MinGW 也已停止了更新。

因此,我们最终下载安装的是MinGW-w64

下载地址https://sourceforge.net/projects/mingw-w64/files/

下载下来后是一个压缩文件,将它解压缩(解压缩软件推荐Bandizip)得到mingw64文件夹,然后把它拖动到一个合适的位置(或者直接解压缩到这个位置),地址中不要有中文

你可以打开bin目录看下,里面有很多后缀名是.exe 的可执行程序,这些就是开发时所需的工具,如:gcc.exe 是C语言程序的编译器,g++.exe 是C++语言的编译器,gdb.exe 是用来调试程序的 debug 工具。

还有一些头文件也里面,如stdio.h的位置是C:\Program Files\mingw64\x86_64-w64-mingw32\include

然后,为了让程序能访问到这些编译程序,需要把它们所在的目录(我这里是C:\Program File\mingw64\bin,点击地址栏进行复制)添加到环境变量Path中。

环境变量是 Windows 系统中用来指定运行环境的一些参数,它包含了关于系统及当前登录用户的环境信息字符串。当用户运行某些程序时,系统除了会在当前文件夹中寻找某些文件外,还会到环境参数的默认路径中去查找程序运行时所需要的系统文件。

环境变量配置后,可以验证一下,搜索打开cmd命令提示符,输入gcc --version(中间有空格),按回车,看到如下信息 :

Step 2 文件结构

文件结构就是你组织文件夹、文件,决定他们怎样嵌套、怎样从属的方法。

这一步是区分搭建的是语言学习环境还是实际项目开发环境的关键。

这两者有什么区别呢?想想你写hello world时是怎样写的,你写了一个单文件,只有一个.c文件,然后你按下绿色三角进行编译运行生成.exe可执行文件,语言学习环境大都是这样的单文件编译运行调试,或者是涉及到简单的几个头文件和源文件的组合这样的多文件结构。而实际项目开发呢,实际中的一个小项目的目录结构可能长这样:

我们的语言学习环境不是这样的,我们用不到lib、build、makefile等文件夹/文件,我们的目录结构应当方便我们新建一个单文件,然后编译调试,这些文件还应当在一起以方便查看和管理

具体怎么操作:

建议把代码都组织在一个地方,以方便管理。以我为例,我在C盘根目录建了一个名叫Codefield的文件夹,我所有代码相关的东西都组织在这里面。

现在,打开文件资源管理器,找一个合适的地方,创建一个这样的Codefield文件夹(文件夹的名字你也可以改成别的,注意路径中不要出现中文和空格,因为gcc调试器不支持中文路径),然后在这个文件夹下再新建一个文件夹CODE_C,你所有的c语言代码就放在这里面,由于vscode以文件夹组织项目,而我们涉及到单文件和简单的多文件两种情景,所以在CODE_C下再新建两个文件夹C_Single 和 C_Multiple ,这两个就是我们的工作区文件夹了。

今后,涉及到其他代码相关的东西时,你就可以在Codefield文件夹下组织了,比如再学一门C++语言时,建一个CODE_Cpp文件夹;玩leetcode刷算法的时候,建一个Leetcode文件夹;从github克隆别人的项目时,建一个Github文件夹;自己做项目时,建个Projects文件夹……

现在,让我们看一下工作区文件夹,以C_Single为例,这其中的文件结构又该怎么组织?(这一步你不需要建文件,弄明白结构就好)首先要有一个.vscode文件夹(这是vscode的配置文件所在处,下一步会详细讲),然后就是我们的源文件,在学习过程中,通常会写很多的源文件,把他们全堆在一起显然不够优雅,我们对这些源文件进行一下分类,比如按章节分:

或者按类型分:

具体怎么分可以看你的学习情况。还有一个问题,源码编译后会生成exe可执行文件,它们放在哪里?和源文件放在一起的话,当文件夹下文件多起来时会非常杂乱,因此我们选择把exe文件统一放在bin文件夹下,这个bin文件夹不应当直接放在工作区文件夹下,这样会造成不同的源码分类文件夹下的文件都不能重名,于是我们在每一个分类文件夹下都建一个bin文件夹,最终效果如下:

C_Mutile类似但有所不同,由于一组程序由多个文件构成,我们把这C_Single中的单个源文件替换成文件夹就好,每个文件夹里面就是一组源文件,并且exe文件也放在其中,不需要单独的bin目录。

至此,你有了一个合适的文件结构,我们可以开始进行 vscode 的配置了。

Step 3 vscode 基础配置

这一步开始前,我们再来了解几个概念。

命令行:命令行 或 命令行界面,是一种基于文本的用来查看、处理、和操作计算机上的文件和程序的工具。

终端/控制台:普通用户可以简单的把终端和控制台理解为:可以输入命令行并显示程序运行过程中的信息以及程序运行结果的窗口。 不必要严格区分这两者的差别。

shell:终端自身并不执行用户输入的命令,它只是负责把输入的内容传送到主机系统,并把主机系统返回的结果呈现给用户。负责解释执行用户输入的命令并返回结果的,正是Shell,它是沟通用户和系统内核的中间桥梁。

现在思考一个问题,我们搭的这套环境中编辑器选的是vscode,但理论上任何能处理文本的编辑器都能用来写代码,比如Windows自带的记事本,你可以在桌面新建一个txt文件,命名为hello,然后用记事本写个helloworld程序进去,再把这个文件后缀改成.c,这就是一个源代码文件了,我们该如何对它进行编译运行呢?答案是通过命令行,我们已经安装了编译器套装并把它添加进了环境变量,现在可以使用gcc命令了:搜索打开cmd命令提示符,默认进入的是用户目录,输入cd desktop 进入桌面目录,像这样:

然后输入编译命令 gcc -o hello hello.c(注意空格),按下回车,你会发现桌面多了hello.exe文件,这说明我们成功编译生成了可执行文件,然后再在命令行中输入hello.exe运行程序 。

这样每次都用命令行太麻烦了,我们希望用更快捷的方式执行这一过程,但记事本不是专门给你写代码的,它不能提供这样的配置,但是vscode就不一样了,专门写代码的编辑器当然有专门的方式让你快捷地编译运行。这是通过.vscode文件夹下的json配置文件实现的,这些json文件怎么写是由vscode开发团队规定的(感兴趣可以去看官方的文档),其中一个是tasks.json,task是任务的意思,我们的编译和运行就是我们想要vscode执行的任务,为此我们要在tasks.json里写两个task:Build和Run(这里为什么不是Compile呢?是因为从源码到可执行的过程中不仅是编译(Compile),还有预编译、链接等过程,用构建(Build)来表述更合适)。除了编译和运行,我们还需要进行调试(Debug),这个就不是通过task来实现的了,而是通过launch.json文件来实现。

现在,打开vscode,发现全是英文,我们先装个汉化插件:

然后搜索C/C++安装这个插件,这是对语言的支持插件

重启vscode,打开C_Single文件夹:

注意要 文件->打开文件夹 这样打开,vscode中打开的根目录是C_Single

然后新建.vscode文件夹(注意前面有个.),然后在里面新建tasks.json和launch.json

Step 3 vscode 配置文件(Linux + windows)

windows 单文件

tasks.json

{
    "version": "2.0.0",
    "tasks": [
        {//这个大括号里是‘构建(build)’任务
            "label": "build", //任务名称,可以更改,不过不建议改
            "type": "shell", //任务类型,process是vsc把预定义变量和转义解析后直接全部传给command;shell相当于先打开shell再输入命令,所以args还会经过shell再解析一遍
            "command": "gcc", //编译命令,这里是gcc,编译c++的话换成g++
            "args": [    //方括号里是传给gcc命令的一系列参数,用于实现一些功能
                "${file}", //指定要编译的是当前文件
                "-o", //指定输出文件的路径和名称
                "${fileDirname}\\bin\\${fileBasenameNoExtension}.exe", //承接上一步的-o,让可执行文件输出到源码文件所在的文件夹下的bin文件夹内,并且让它的名字和源码文件相同
                "-g", //生成和调试有关的信息
                "-Wall", // 开启额外警告
                "-static-libgcc",  // 静态链接libgcc
                "-fexec-charset=GBK", // 生成的程序使用GBK编码,不加这一条会导致Win下输出中文乱码
                "-std=c11", // 语言标准,可根据自己的需要进行修改,写c++要换成c++的语言标准,比如c++11
            ],
            "group": {  //group表示‘组’,我们可以有很多的task,然后把他们放在一个‘组’里
                "kind": "build",//表示这一组任务类型是构建
                "isDefault": true//表示这个任务是当前这组任务中的默认任务
            },
            "presentation": { //执行这个任务时的一些其他设定
                "echo": true,//表示在执行任务时在终端要有输出
                "reveal": "always", //执行任务时是否跳转到终端面板,可以为always,silent,never
                "focus": false, //设为true后可以使执行task时焦点聚集在终端,但对编译来说,设为true没有意义,因为运行的时候才涉及到输入
                "panel": "new" //每次执行这个task时都新建一个终端面板,也可以设置为shared,共用一个面板,不过那样会出现‘任务将被终端重用’的提示,比较烦人
            },
            "problemMatcher": "$gcc" //捕捉编译时编译器在终端里显示的报错信息,将其显示在vscode的‘问题’面板里
        },
        {//这个大括号里是‘运行(run)’任务,一些设置与上面的构建任务性质相同
            "label": "run", 
            "type": "shell", 
            "dependsOn": "build", //任务依赖,因为要运行必须先构建,所以执行这个任务前必须先执行build任务,
            "command": "${fileDirname}\\bin\\${fileBasenameNoExtension}.exe", //执行exe文件,只需要指定这个exe文件在哪里就好
            "group": {
                "kind": "test", //这一组是‘测试’组,将run任务放在test组里方便我们用快捷键执行
                "isDefault": true
            },
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": true, //这个就设置为true了,运行任务后将焦点聚集到终端,方便进行输入
                "panel": "new"
            }
        }

    ]
}

launch.json

{
    "version": "0.2.0",
    "configurations": [
        {//这个大括号里是我们的‘调试(Debug)’配置
            "name": "Debug", // 配置名称
            "type": "cppdbg", // 配置类型,cppdbg对应cpptools提供的调试功能;可以认为此处只能是cppdbg
            "request": "launch", // 请求配置类型,可以为launch(启动)或attach(附加)
            "program": "${fileDirname}\\bin\\${fileBasenameNoExtension}.exe", // 将要进行调试的程序的路径
            "args": [], // 程序调试时传递给程序的命令行参数,这里设为空即可
            "stopAtEntry": false, // 设为true时程序将暂停在程序入口处,相当于在main上打断点
            "cwd": "${fileDirname}", // 调试程序时的工作目录,此处为源码文件所在目录
            "environment": [], // 环境变量,这里设为空即可
            "externalConsole": false, // 为true时使用单独的cmd窗口,跳出小黑框;设为false则是用vscode的内置终端,建议用内置终端
            "internalConsoleOptions": "neverOpen", // 如果不设为neverOpen,调试时会跳到“调试控制台”选项卡,新手调试用不到
            "MIMode": "gdb", // 指定连接的调试器,gdb是minGW中的调试程序
            "miDebuggerPath": "C:\\Program Files\\mingw64\\bin\\gdb.exe", // 指定调试器所在路径,如果你的minGW装在别的地方,则要改成你自己的路径,注意间隔是\\
            "preLaunchTask": "build" // 调试开始前执行的任务,我们在调试前要编译构建。与tasks.json的label相对应,名字要一样
    }]
}

windows 多文件

tasks.json

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "gcc", //写c++换成g++
            "args": [
                "${fileDirname}\\*.c", //写c++把 *.c 换成 *.cpp
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe",
                "-g",
                "-Wall", 
                "-static-libgcc",   
                "-fexec-charset=GBK",
                "-std=c11",  //写c++换成c++标准
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": false,
                "panel": "new"
            },
            "problemMatcher": "$gcc"
        },
        {
            "label": "run",
            "type": "shell",
            "dependsOn": "build",
            "command": "${fileDirname}\\${fileBasenameNoExtension}.exe",
            "group": {
                "kind": "test",
                "isDefault": true
            },
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": true,
                "panel": "new"
            }
        }

    ]
}

launch.json

{
    "version": "0.2.0",
    "configurations": [{
        "name": "Debug", 
        "type": "cppdbg", 
        "request": "launch",
        "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
        "args": [],
        "stopAtEntry": false, 
        "cwd": "${fileDirname}", 
        "environment": [], 
        "externalConsole": false,
        "internalConsoleOptions": "neverOpen",
        "MIMode": "gdb", 
        "miDebuggerPath": "C:\\Program Files\\mingw64\\bin\\gdb.exe", 
        "preLaunchTask": "build" 
    }]
}

linux 单文件

task.json

{
  "version": "2.0.0",
  "tasks": [
      {//这个大括号里是‘构建(build)’任务
          "label": "build", //任务名称,可以更改,不过不建议改
          "type": "shell", //任务类型,process是vsc把预定义变量和转义解析后直接全部传给command;shell相当于先打开shell再输入命令,所以args还会经过shell再解析一遍
          "command": "g++", //编译命令,这里是gcc,编译c++的话换成g++
          "args": [    //方括号里是传给gcc命令的一系列参数,用于实现一些功能
              "${file}", //指定要编译的是当前文件
              "-o", //指定输出文件的路径和名称
              "${fileDirname}/${fileBasenameNoExtension}", //承接上一步的-o,让可执行文件输出到源码文件所在的文件夹下的bin文件夹内,并且让它的名字和源码文件相同
              "-g", //生成和调试有关的信息
              // "-Wall", // 开启额外警告
              // "-static-libgcc",  // 静态链接libgcc
              // "-fexec-charset=GBK", // 生成的程序使用GBK编码,不加这一条会导致Win下输出中文乱码
              // "-std=c11", // 语言标准,可根据自己的需要进行修改,写c++要换成c++的语言标准,比如c++11
          ],
          "group": {  //group表示‘组’,我们可以有很多的task,然后把他们放在一个‘组’里
              "kind": "build",//表示这一组任务类型是构建
              "isDefault": true//表示这个任务是当前这组任务中的默认任务
          },
          "presentation": { //执行这个任务时的一些其他设定
              "echo": true,//表示在执行任务时在终端要有输出
              "reveal": "always", //执行任务时是否跳转到终端面板,可以为always,silent,never
              "focus": false, //设为true后可以使执行task时焦点聚集在终端,但对编译来说,设为true没有意义,因为运行的时候才涉及到输入
              "panel": "new" //每次执行这个task时都新建一个终端面板,也可以设置为shared,共用一个面板,不过那样会出现‘任务将被终端重用’的提示,比较烦人
          },
          "problemMatcher": "$gcc" //捕捉编译时编译器在终端里显示的报错信息,将其显示在vscode的‘问题’面板里
      },
      {//这个大括号里是‘运行(run)’任务,一些设置与上面的构建任务性质相同
          "label": "run", 
          "type": "shell", 
          "dependsOn": "build", //任务依赖,因为要运行必须先构建,所以执行这个任务前必须先执行build任务,
          "command": "${fileDirname}/${fileBasenameNoExtension}", //执行exe文件,只需要指定这个exe文件在哪里就好
          "group": {
              "kind": "test", //这一组是‘测试’组,将run任务放在test组里方便我们用快捷键执行
              "isDefault": true
          },
          "presentation": {
              "echo": true,
              "reveal": "always",
              "focus": true, //这个就设置为true了,运行任务后将焦点聚集到终端,方便进行输入
              "panel": "new"
          }
      }

  ]
}

launch.json

{
  "version": "0.2.0",
  "configurations": [
    { //这个大括号里是我们的‘调试(Debug)’配置
      "name": "Debug", // 配置名称
      "type": "cppdbg", // 配置类型,cppdbg对应cpptools提供的调试功能;可以认为此处只能是cppdbg
      "request": "launch", // 请求配置类型,可以为launch(启动)或attach(附加)
      "program": "${fileDirname}/${fileBasenameNoExtension}", // 将要进行调试的程序的路径
      "args": [], // 程序调试时传递给程序的命令行参数,这里设为空即可
      "stopAtEntry": false, // 设为true时程序将暂停在程序入口处,相当于在main上打断点
      "cwd": "${fileDirname}", // 调试程序时的工作目录,此处为源码文件所在目录
      "environment": [], // 环境变量,这里设为空即可
      "externalConsole": false, // 为true时使用单独的cmd窗口,跳出小黑框;设为false则是用vscode的内置终端,建议用内置终端
      "MIMode": "gdb", // 指定连接的调试器,gdb是minGW中的调试程序
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ],
      // "internalConsoleOptions": "neverOpen", // 如果不设为neverOpen,调试时会跳到“调试控制台”选项卡,新手调试用不到
      "miDebuggerPath": "/usr/bin/gdb", // 指定调试器所在路径
      "preLaunchTask": "build" // 调试开始前执行的任务,我们在调试前要编译构建。与tasks.json的label相对应,名字要一样
    }
  ]
}

linux 多文件

windows 与 linux 的主要差异在于路径不同,其他的大同小异,ubuntu 会自带 g++/gcc,可以使用 whereis 命令查看所在目录
单文件和多文件的差别主要在于参数是 "\({fileDirname}/*.cpp" 还是 "\){file}"。
linux 路径注意不要有空格,否则很容易发生找不到文件的情况
tasks.json

{
  "version": "2.0.0",
  "tasks": [
      {//这个大括号里是‘构建(build)’任务
          "label": "build", //任务名称,可以更改,不过不建议改
          "type": "shell", //任务类型,process是vsc把预定义变量和转义解析后直接全部传给command;shell相当于先打开shell再输入命令,所以args还会经过shell再解析一遍
          "command": "g++", //编译命令,这里是gcc,编译c++的话换成g++
          "args": [    //方括号里是传给gcc命令的一系列参数,用于实现一些功能
            "${fileDirname}/*.cpp", //指定要编译的是当前文件
              "-o", //指定输出文件的路径和名称
              "${fileDirname}/${fileBasenameNoExtension}", //承接上一步的-o,让可执行文件输出到源码文件所在的文件夹下的bin文件夹内,并且让它的名字和源码文件相同
              "-g", //生成和调试有关的信息
              // "-Wall", // 开启额外警告
              // "-static-libgcc",  // 静态链接libgcc
              // "-fexec-charset=GBK", // 生成的程序使用GBK编码,不加这一条会导致Win下输出中文乱码
              // "-std=c11", // 语言标准,可根据自己的需要进行修改,写c++要换成c++的语言标准,比如c++11
          ],
          "group": {  //group表示‘组’,我们可以有很多的task,然后把他们放在一个‘组’里
              "kind": "build",//表示这一组任务类型是构建
              "isDefault": true//表示这个任务是当前这组任务中的默认任务
          },
          "presentation": { //执行这个任务时的一些其他设定
              "echo": true,//表示在执行任务时在终端要有输出
              "reveal": "always", //执行任务时是否跳转到终端面板,可以为always,silent,never
              "focus": false, //设为true后可以使执行task时焦点聚集在终端,但对编译来说,设为true没有意义,因为运行的时候才涉及到输入
              "panel": "new" //每次执行这个task时都新建一个终端面板,也可以设置为shared,共用一个面板,不过那样会出现‘任务将被终端重用’的提示,比较烦人
          },
          "problemMatcher": "$gcc" //捕捉编译时编译器在终端里显示的报错信息,将其显示在vscode的‘问题’面板里
      },
      {//这个大括号里是‘运行(run)’任务,一些设置与上面的构建任务性质相同
          "label": "run", 
          "type": "shell", 
          "dependsOn": "build", //任务依赖,因为要运行必须先构建,所以执行这个任务前必须先执行build任务,
          "command": "${fileDirname}/${fileBasenameNoExtension}", //执行exe文件,只需要指定这个exe文件在哪里就好
          "group": {
              "kind": "test", //这一组是‘测试’组,将run任务放在test组里方便我们用快捷键执行
              "isDefault": true
          },
          "presentation": {
              "echo": true,
              "reveal": "always",
              "focus": true, //这个就设置为true了,运行任务后将焦点聚集到终端,方便进行输入
              "panel": "new"
          }
      }

  ]
}

launch.json

{
  "version": "0.2.0",
  "configurations": [
    { //这个大括号里是我们的‘调试(Debug)’配置
      "name": "Debug", // 配置名称
      "type": "cppdbg", // 配置类型,cppdbg对应cpptools提供的调试功能;可以认为此处只能是cppdbg
      "request": "launch", // 请求配置类型,可以为launch(启动)或attach(附加)
      "program": "${fileDirname}/${fileBasenameNoExtension}", // 将要进行调试的程序的路径
      "args": [], // 程序调试时传递给程序的命令行参数,这里设为空即可
      "stopAtEntry": false, // 设为true时程序将暂停在程序入口处,相当于在main上打断点
      "cwd": "${fileDirname}", // 调试程序时的工作目录,此处为源码文件所在目录
      "environment": [], // 环境变量,这里设为空即可
      "externalConsole": false, // 为true时使用单独的cmd窗口,跳出小黑框;设为false则是用vscode的内置终端,建议用内置终端
      "MIMode": "gdb", // 指定连接的调试器,gdb是minGW中的调试程序
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ],
      // "internalConsoleOptions": "neverOpen", // 如果不设为neverOpen,调试时会跳到“调试控制台”选项卡,新手调试用不到
      "miDebuggerPath": "/usr/bin/gdb", // 指定调试器所在路径
      "preLaunchTask": "build" // 调试开始前执行的任务,我们在调试前要编译构建。与tasks.json的label相对应,名字要一样
    }
  ]
}
posted @ 2021-07-21 11:17  锦瑟,无端  阅读(5783)  评论(0编辑  收藏  举报