windows 10 上使用 vscode 编译运行和调试 C/C++
windows 10 上使用 vscode 编译运行和调试 C/C++
初始URL: https://zhuanlan.zhihu.com/p/77645306
主要讲如何在 vscode 上实现编译 / 运行 / 调试 C 以及 C++,如果是初学者,就请完全按照文章的步骤进行,如果觉得图片不够清晰,点击一下图片会显示清晰的大图
一、前期准备
- 首先在微软官网下载并安装好
visual stdio code
,建议在安装时将选项全勾选上
勾选后在文件和文件夹的右键菜单中会多出 Open with Code
这个选项,也就是用 vscode 打开当前文件 / 文件夹
- 因为 vscode 只是一个代码编辑器,没有自带有 C/C++ 的编译器,因此首先需要安装一个 C/C++ 编译器并且设置环境变量,这里使用 mingw-w64。因为网络问题 mingw-w64 很难下载,建议离线下载然后手动添加环境变量
离线下载的地址:
MinGW-w64 - for 32 and 64 bit Windows
为节省篇幅,具体的细节参见:
windows 下安装 mingw-w64 - tyuiop - 博客园
此时我们要验证一下 mingw 是否可用,打开 cmd 输入 gcc -v,出现版本信息就表明 mingw 是可用的,如果未出现版本信息则需要再检查一下,如果这里出现问题,后面全部无法进行
- 安装必要的插件,打开 vscode,点击左面竖排第五个按钮,搜索并安装上如下三个插件
- chinese(simplified)
- C/C++
- Code Runner(这个是最重要的部分,也就是使用这个插件能够进行编译运行以及调试)
安装好以后重启一下 vscode,界面切换为中文,为了避免麻烦,暂时不要安装其他插件
二、编译运行程序
编译运行程序介绍两种方法
- 使用之前安装好的
Code Runner插件
一键编译运行程序 - 打开 vscode 的
集成终端
使用命令行编译和运行
点击:文件 > 新建文件,出现一个空白文档,将下面的代码复制粘贴到空白文档中
1 |
|
然后按Ctrl+S
**将文件后缀名改为.c
或.cpp
**后保存到电脑上,然后点右上角的三角形按钮
但现在会出现下面的情况
程序段中使用了scanf
函数从键盘读取一串字符,这时无法输入数据,也无法结束程序,需要重启一下 vscode
然后依次打开:文件 > 首选项 > 设置 > 用户 > 拓展 > Run Code Configuration
找到**Run In Terminal
**勾选上
现在程序已经可以正常运行了,此时程序是运行在 vscode 的集成终端上,并不会额外弹出一个外部窗口
点击右上角的垃圾桶图标可以直接结束程序运行并关闭集成终端
**替补插件:**编译运行 C/C++ 也可以选择C/C++ Compile Run
插件,按 f6 一键运行
相较于code runner
,C/C++ Compile Run
插件在勾选上: 文件 > 首选项 > 设置 > 扩展 > Compile Run Configuration 的Run-in-external-terminal
选项后可以出现和 dev / codeblocks / vc 一样的外部窗口
用插件运行程序是一种偷懒的方法,它本质是替用户输入了命令,它存在局限,看一个例子
假设说我们在代码中使用了 winsock2.h
这个头文件,我们用刚刚的Code Runner插件
的方式编译会无法通过
1 |
|
造成问题是原因是:Code Runner 是按照预先设定好的规则,自动在终端执行编译运行的指令,也就是图片上红色下划线标注出的
1 |
|
如果是使用了winsock2.h
,同时又是使用gcc/g++
编译,在编译时我们应该在编译指令中额外添加-lwsock32
指令,而Code Runner
默认下并不会添加这条指令
正确的编译指令应该是:
1 |
|
为了解决这个问题,可以使用比较原始的方法,**直接在终端上用命令行编译和运行,**vscode 有一个集成终端,可以连通安装在操作系统上的各种终端
按 Ctrl+~
打开集成终端(其实是 “`”,打 “~” 是方便大家找到),输入
1 |
|
三、调试程序
当程序遇到 bug,我们可以单步调试来定位错误,vscode 支持添加断点,添加监视,显示鼠标指向变量的值,调试控制台查询变量值,详细细节我录制了一个演示视频(内容是快速排序)
更加高清的视频可以看上传到 b 站的版本
https://www.bilibili.com/video/av63356142
进入正题
首先在电脑上的某个你习惯的位置新建一个文件夹(工作区),用于存放将要编写的代码,接下来配置好的调试环境,仅会对存放在这一个文件夹以及文件夹的子目录里的程序生效
务必注意!调试的文件名和文件路径中不能出现**中文字符!!**否则将无法启动调试!
这是由于调试用到的 mingw 中的 gdb 不支持中文路径!和 vscode 无关,下面是两个错误示范
新建好文件夹后,在 vscode 界面,点击:文件 > 打开文件夹,用 vscode 打开刚刚新建的文件夹(安装时勾选了右键打开可以直接右键选通过code打开
)
在 vscode 资源管理器点击新建文件夹图标新建一个.vscode
文件夹(注意前面的 “.” 号)
然后在. vscode 文件夹下新建两个 json 文件分别叫做
- launch.json
- tasks.json
然后将下面的代码复制到对应的 json 文件中去并保存,要仔细阅读后面两段说明性文字
launch.json
1 |
|
tasks.json
如果需要是c语言也就是gcc将下面的command项由g++改为gcc
如果是多文件编译(即函数声明和函数定义分开,不懂的别乱改),需要将 args 列表中的
"${file}"
项修改为"${workspaceFolder}/*.cpp"
,多文件推荐用 cmake
1 |
|
事实上现在已经可以正常调试了,并且现在可以按 ctrl+shift+b 直接调用配置好的 task 编译而不运行程序,类似于一些 IDE 的编译选项
测试一下,新建一个.cpp
文件将下面的代码粘贴进去,并在适当的地方添加上断点
1 |
|
按f5
或者启动调试的按钮启动调试,程序执行到断点处会停下
顶部六个按钮分别代表
- 继续执行到下一个断点处
- 执行下一条语句,遇到函数直接执行完不会跳转进函数
- 执行下一条语句,遇到函数会跳转进函数继续单步执行
- 跳出当前所在的函数,如果是主函数会结束程序
- 重新启动调试
- 结束调试
集成终端在底部终端栏输入数据,如果是希望像 vs2019 一样,启动调试后显示外部窗口而不是在 vscode 集成终端进行调试
只需将launch.json
中的"externalConsole"
后面的值由 false 改为 true
在单步调试的过程中我们可以添加监视来实时监视变量或表达式值的变化
也可以在调试控制台
中输入想获取结果的变量名或者表达式获得当前的值
或者直接将鼠标光标移动到变量位置上,会自动显示当前变量的值
如果数组开得过大或者是一些结构较复杂的类或结构体,查询或显示值可能会导致调试程序崩溃
强调:调试是属于工作区设置,当前配置的调试环境只会对当前. vscode 文件夹所在路径下的文件生效,如果要换用别的文件夹,可以直接把. vscode 这个文件夹拷贝过去
补充
类似于 code runner 的问题
如果是需要有额外的编译指令如-lwsock32, 需要调试前事先在 tasks.json 的args处添加上对应的指令, 或者用 // 注释掉 launch.json 中的 preLaunchTask:“compile”(启动调试前执行编译任务) 这一项, 然后自己编译好后再执行调试,也可以直接使用 cmake
找不到头文件问题
对于安装了 vs2019 却使用 mingw 的情况,这时 vscode 代码检测会默认使用 vs2019 的 msvc 编译器的头文件,如果你使用 mingw 独有的特殊头文件会报找不到头文件的错误。
鼠标移动到报错头文件会显示一个灯泡,点击,选编辑 “includePath” 设置,然后在指定编译器下拉列表中选择 gcc 或者 g++
vscode 集成终端问题
windows 10 1903/1909 版本,不能使用cmd(包括cmder),git bash作为默认终端,这两个终端输入clear / cls指令后再关闭终端会造成 vscode 无响应
PowerShell
作为默认终端时,虽然不存在clear
的问题,但如果往终端输入了任何数据或指令又没有按回车就直接关闭了,同样会造成 vscode 无响应
WSL
没有发现类似的 bug
强迫症治疗
1903 及以上版本 windows 10,把PowersShell作为默认终端打开时,会显示一条pscore的广告 –" 尝试新的跨平台 PowerShell https://aka.ms/pscore6"
1803/1809 版本的则会因为 bug 显示一堆空白
解决方法:唐铭:移除 vscode 集成终端启动时显示的多余信息
更加完美的解决方法:唐铭:PowerShell 美化及自定义
后记
文章的核心内容均参考微软官方文档 mingw 部分
https://code.visualstudio.com/docs/cpp/config-mingw
在评论区或者私信里向我提问的人,大部分问题我都会在摸鱼时回复,但对于文章里已经写的很明白的以及抄别人文章有问题(不是一个两个了)跑来问我的,我一般是不回复的
相关内容
唐铭: Windows Terminal 终端入门唐铭:vscode wsl 入门唐铭:Linux 上使用 vscode 编译运行和调试 C/C++