vscode: windows/linux下配置C/C++编译和调试环境

作者:__lifanxin
链接:https://blog.csdn.net/A951860555/article/details/109175215
来源:CSDN
著作权归作者所有,任何形式的转载都请联系作者。

说在前面

  本文是从官方文档以及实际操作中总结而来,对于从事该行业的专业人员来说,推荐多看官方英文文档;当然对于初学者而言,先行阅读一个较好的中文指导博客也是无可厚非的。

链接: vscode C/C++环境配置官方文档.

正式起步

安装gcc组件

  windows下可以下载mingw-w64,关于mingw-w64的说明可以参见百度百科。而对于大多数linux系统而言,一般都自带有gcc、g++的编译环境,所有如果你正在使用常见的ubuntu系统、mac系统的话就不需要安装。

添加环境变量

  这一步是需要windows用户单独操作的,也就是并不自带gcc组件的系统。
  添加环境变量的步骤很简单,首先找到正确的gcc组件所在的bin目录,也就是说目录路径只能到bin为止,而不能明确到gcc,因为在bin目录下不止有gcc,还有g++、gdb等程序。然后在win10系统中可以直接搜索环境变量,添加到系统变量或者用户变量的path即中。
  在添加环境变量后,我们就可以在终端中直接输入gcc --version等命令,如果显示版本信息即可证明添加成功。这是因为本来在终端需要执行一个命令就是在path环境变量中去查找该命令程序的所在目录,一般系统都会自动配置一些程序路径在这里,所以像自带gcc组件的ubuntu和mac这些早已配置好了相应环境变量的系统,不用配置也能在终端执行相应命令。当然我们之所以需要在这里添加环境变量,只是为了方便后面vscode自动生成一些配置文件时可以找到gcc、g++的路径。

创建helloworld项目

  下面我们开始用helloworld项目来完善我们的配置。
  新建一个test文件夹,在文件下新建hello.c或者hello.cpp,一个用于C语言,一个用于C++。接下来就是最关键的配置文件生成部分。

hello.c

#include <stdio.h>


int main(void)
{
    printf("hello, world\n");
    return 0;
}

hello.cpp

#include <iostream>


int main(void)
{
    using namespace std;
    
    cout << "hello, world!" << endl;
    return 0;
}

生成编译配置文件

编译配置-->tasks.json

  首先,选中.p或者.cpp文件,也就是一定要在vscode中打开相应的源代码文件(否则不会出现如下第二张图的模板文件选项),然后按照下图一中进行操作,点击Terminal-->Configure Tasks或者Configure Default Build Task。

创建tasks.json

  接下来会出现vscode自带的模板文件选项,是C就选择gcc.exe,是C++就选择g++.exe
C++编译模板配置

  不同的系统展示会略有区别,如下是ubuntu系统所示,会展示详细的compiler信息来帮助我们进行选择。

ubuntu tasks.json

  选中相应的模板文件后,会在当前目录下生成.vscode文件夹,里面会出现tasks.json文件,该文件即对应执行程序编译的配置文件,其内容如下:

windows下tasks.json

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "C/C++: g++.exe build active file",
            "command": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\bin\\g++.exe",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

ubuntu下tasks.json

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++ build active file",
            "command": "/usr/bin/g++",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "/usr/bin"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "compiler: /usr/bin/g++"
        }
    ]
}

关键键值名

  上面的两个文件大同小异,对于json文件中的健我们可以直接在vscode中通过鼠标的悬停来进行了解,不过这里我们着重了解一些关键的健值就行了。

  • label
      可以理解为tasks这个健所对应数组中第一个配置对象的名字,也就是说我们还可以在此数组中配置第二个编译指令,如下图所示,注意label标签名的不同且两个配置之间有逗号隔开。所以如果你有在同一个项目中配置不同编译的需要,就可以这样配置。

以windows下tasks.json为例,其它系统也一样

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "C/C++: g++.exe build active file",
            "command": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\bin\\g++.exe",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
        {
            "type": "shell",
            "label": "C/C++: NEW g++.exe build active file",
            "command": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\bin\\g++.exe",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}
  • command
      顾名思义就是编译所需要的程序命令,如果之前配置好了环境变量,那么就会自动生成该路径,否则需要自己手动配置。上图中,windows的tasks.json中command是我自己电脑上的gcc路径,而ubuntu使用自己的系统环境路径/usr/bin/g++。注意linux系统中的程序没有后缀名.exe
      当然如果编译C就使用gcc,编译C++就使用g++,当然用gcc也可以编译C++程序源代码,不过需要加上链接库-lstdc++,否则会报找不到C++特定库中方法的错误。该参数需要添加在下面的args字段中。
  • args
      args字段实际上就是gcc、g++命令的参数,也就是说如果通过终端使用gcc编译C++源代码文件,需要输入gcc -g hello.c -o hello.exe -lstdc++-g表明启用调试(然后可以在终端使用gdb进行调试,否则不行),-o是指定输出文件的名字(否则自动为a.out),-lstdc++指明链接C++的库(否则编译报错)。
      因此vscode就是把该终端命令分成了两部分,command指明了所使用的程序,args指明了后面接的参数。当然vscode中使用了一些特定的标签名,${file}代表在vscode中呈现在活动界面即当前打开且被选中的文件;"${fileDirname}\\${fileBasenameNoExtension}.exe${fileDirname}是一个变量名,代表被选中文件所在的文件夹,windows下用双反斜杠\\隔开路径(第一个反斜杠表示转义,即双反斜杠在json才代表一个\\是windows路径下的分隔符,否则在json中使用\会转义字符$),然后${fileBasenameNoExtension}.exe表示使用被选中的文件名但不用其扩展名,然后以后缀.exe作为扩展名;而ubuntu下使用的是斜杠/分割路径,并且没有后缀名,当然在vscode还有更多的变量名,可以参考官方文档:

链接:tasks.json和launch.json文件中的变量说明

tasks.json完整配置

  windows下tasks.json完整配置如下图所示,ubuntu见上图第一次给出的tasks.json文件:

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "C/C++: g++.exe build active file",
            // 使用自己电脑上的路径
            "command": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\bin\\g++.exe",
            "args": [
                "-g",
                // 想编译当前文件夹下所有.cpp文件可以这样写
                // "${fileDirname}\\*.cpp"
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

启动编译

  如下图所示,点击Terminal-->Run Build Task执行默认的编译选项(Run Task 会列出所有的编译配置选项),此操作会使用我们之前配置好的tasks.json文件来对源代码进行编译,在windows下生成hello.exe文件,ubuntu下生成的程序则没有后缀名。

启动编译

  至此,我们的C/C++的编译环境已经配好,windows下在终端输入./hello.exe,ubuntu下输入./hello即可运行程序。下面进入调试环境的配置。

生成调试配置文件

调试配置-->launch.json

  同上面一样,选中需要进行debug调试的文件,按照下图所示点击Run-->Add Configuration即可在.vscode文件夹下生成launch.json文件。

创建launch.json

windows下launch.json

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 启动",
            "type": "cppdbg",
            "request": "launch",
            "program": "输入程序名称,例如 ${workspaceFolder}/a.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "/path/to/gdb",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

ubuntu下launch.json

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "g++ - Build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: g++ build active file",
            "miDebuggerPath": "/bin/gdb"
        }
    ]
}

关键键值名

  如上图所示,在ubuntu下可能已经自动生成好了完整的debug调试配置,如果没有也没关系,按照下面的操作进行就行。

  • name
      该json配置对象的名字。同样也可以在此为launch.json配置多个debug调试对象,添加方式和tasks.json一样,只需要把配置放在Configurations数组中,命名一个不同的name
  • program
      指明你需要调试的程序名,即上一步编译生成的可执行文件,该字段内的内容需要重新编写,自动生成的内容已给出了示例:${workspaceFolder}\\a.exe。其中${workspaceFolder}表示在vscode中所打开的根文件夹,可以替换为${fileDirname}表示打开文件所在的文件夹;a.exe应该替换为自己需要调试的程序名,或者改为${fileBasenameNoExtension}.exe自动衔接上文tasks.json生成的程序名,这里还应当注意程序所在的目录路径是否相符合。注意ubuntu下使用/分隔路径,程序名不加.exe后缀。
  • args
      args中是gdb命令所需要的参数,一般不用写,有特殊需要的可以在网上查找相关的资料。
  • MIMode
      指明调试所使用的程序,按照默认设置为gdb即可。
  • miDebuggerPath
      指明调试程序的路径,在这里需要更改为自己的gdb路径且要包括gdb.exe此程序名字,例如我的:C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\bin\\gdb.exe。ubuntu下为/usr/bin/gdb或者/bin/gdb
  • preLaunchTask
      这个键值在上面windows自动生成的配置中并没有出现,需要自己配置一下(和上图ubuntu中的配置一样)。该键值的目的是指出在执行debug调试之前需要执行的tasks任务,也就是tasks.json下的某个编译指令。在这里,我们将preLaunchTask键值设为C/C++: g++.exe build active file即对应我们之前配置好的tasks.json中的label标签名,这样一来我们在直接debug时就可以自动运行相应的编译指令,而不用每次都要先编译一下,然后再debug调试。

launch.json完整配置

  下面给出windows下完整的launch.json配置,ubuntu完整配置见上图第一次给出的launch.json:

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 启动",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}\\${fileBasenameNoExtension}.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            // 替换为自己电脑上的gdb路径
            "miDebuggerPath": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\bin\\gdb.exe`",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            // 要和tasks.json中的label标签名对应
            "preLaunchTask": "C/C++: g++.exe build active file"
        }
    ]
}

启动调试

  如下图所示,点击Run-->Start Debugging,即会按照launch.json文件配置来对相应的程序进行debug。


启动调试

  在调试的时候给程序打好断点,如下图所示,我对代码略微进行了修改,声明了num变量,运行debug调试后,点击有个虫子(bug)样式的图标,然后在左侧栏就可以看到变量的值。


断点调试

结束语

  经过上面一番折腾,我们已经配置好C/C++程序的编译和调试环境,当然如果需要在其它项目中应用相同的环境配置,可以直接复制.vscode到其它项目的根目录下即可。那么,现在就开始愉快的编程吧!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容