windows 10 上使用 vscode 编译运行和调试 C/C++

windows 10 上使用 vscode 编译运行和调试 C/C++

初始URL: https://zhuanlan.zhihu.com/p/77645306

主要讲如何在 vscode 上实现编译 / 运行 / 调试 C 以及 C++,如果是初学者,就请完全按照文章的步骤进行,如果觉得图片不够清晰,点击一下图片会显示清晰的大图

一、前期准备

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

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/fc13c63d-b322-4077-be17-af685c7f56c2.jpeg

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

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/65094fc8-58f9-45b7-bd22-a4bb332887e7.jpeg

  1. 因为 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 是可用的,如果未出现版本信息则需要再检查一下,如果这里出现问题,后面全部无法进行

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/3832a9e7-856a-4980-97b7-a058e6c14bb3.jpeg

  1. 安装必要的插件,打开 vscode,点击左面竖排第五个按钮,搜索并安装上如下三个插件
  • chinese(simplified)
  • C/C++
  • Code Runner(这个是最重要的部分,也就是使用这个插件能够进行编译运行以及调试)

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/e1c2f544-8227-49d4-8eec-1e8d4287d30b.jpeg

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

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/76261ac9-2918-4364-871e-3804ddd5b65e.jpeg

二、编译运行程序

编译运行程序介绍两种方法

  1. 使用之前安装好的Code Runner插件一键编译运行程序
  2. 打开 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**后保存到电脑上,然后点右上角的三角形按钮

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/39723ee0-ed30-4d9b-aaa1-382565952a51.jpeg

但现在会出现下面的情况

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/9ef11634-38f0-4a32-bfe5-684390314236.png

程序段中使用了scanf函数从键盘读取一串字符,这时无法输入数据,也无法结束程序,需要重启一下 vscode

然后依次打开:文件 > 首选项 > 设置 > 用户 > 拓展 > Run Code Configuration

找到**Run In Terminal**勾选上

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/2e7dc635-ec9f-4753-8d28-5d59631c9a64.jpeg

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/25952c55-5601-44e7-80e5-4c939d5ff952.jpeg

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

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/9b711b1a-bc86-473d-9d34-cc0a6a02a272.jpeg

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

**替补插件:**编译运行 C/C++ 也可以选择C/C++ Compile Run插件,按 f6 一键运行

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/c5be60bf-cf3d-462b-83bb-f0370484ff1e.jpeg

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/c5971843-86d8-45b1-87d6-055cbb5f68fe.jpeg

相较于code runnerC/C++ Compile Run插件在勾选上: 文件 > 首选项 > 设置 > 扩展 > Compile Run Configuration 的Run-in-external-terminal选项后可以出现和 dev / codeblocks / vc 一样的外部窗口

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/3401f3c3-72bc-4ebb-99ec-17efc593195d.jpeg

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/b9967ffc-e775-43e5-b811-e0720e7e6262.jpeg

用插件运行程序是一种偷懒的方法,它本质是替用户输入了命令,它存在局限,看一个例子

假设说我们在代码中使用了 winsock2.h这个头文件,我们用刚刚的Code Runner插件的方式编译会无法通过

1
2
3
4
5
6
#include <winsock2.h>
#include <stdio.h>
int main(){
SOCKET client_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
printf("Compile successfully!");
}

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/2480f52e-1229-4327-94af-6982d89a1a68.png

造成问题是原因是:Code Runner 是按照预先设定好的规则,自动在终端执行编译运行的指令,也就是图片上红色下划线标注出的

1
g++ Untitled-1.cpp -o Untitled-1  ;

如果是使用了winsock2.h,同时又是使用gcc/g++编译,在编译时我们应该在编译指令中额外添加-lwsock32指令,而Code Runner默认下并不会添加这条指令

正确的编译指令应该是:

1
g++ xxx.cpp -o xxx.exe -lwsock32

为了解决这个问题,可以使用比较原始的方法,**直接在终端上用命令行编译和运行,**vscode 有一个集成终端,可以连通安装在操作系统上的各种终端

Ctrl+~ 打开集成终端(其实是 “`”,打 “~” 是方便大家找到),输入

1
2
g++ .\文件名.cpp -o 文件名.exe -lwsock32
./文件名.exe

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/242a6c96-85a7-4733-9226-c3e49dd4d364.png

三、调试程序

当程序遇到 bug,我们可以单步调试来定位错误,vscode 支持添加断点,添加监视,显示鼠标指向变量的值,调试控制台查询变量值,详细细节我录制了一个演示视频(内容是快速排序)

更加高清的视频可以看上传到 b 站的版本

https://www.bilibili.com/video/av63356142

进入正题

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

务必注意!调试的文件名文件路径中不能出现**中文字符!!**否则将无法启动调试!

这是由于调试用到的 mingw 中的 gdb 不支持中文路径!和 vscode 无关,下面是两个错误示范

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/141a426e-677a-40d8-a274-4cd8dd8664ce.png

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/a5adef44-b01b-41ee-87f8-b0b26654ae05.png

新建好文件夹后,在 vscode 界面,点击:文件 > 打开文件夹,用 vscode 打开刚刚新建的文件夹(安装时勾选了右键打开可以直接右键选通过code打开

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/7a933dee-9980-4dd4-bb16-6cdfa1fb784b.jpeg

在 vscode 资源管理器点击新建文件夹图标新建一个.vscode文件夹(注意前面的 “.” 号)

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/c29be9ed-fb9a-4837-a268-6ad580c3cb5b.jpeg

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

  • launch.json
  • tasks.json

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/7e072499-f219-48cb-b8f1-a2abe18be519.jpeg

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/8272591f-1a35-47be-bf7c-c91a72c6aed4.jpeg

然后将下面的代码复制到对应的 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
26
{
"version": "0.2.0",
"configurations": [
{
"name": "C/C++",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "gdb.exe",
"preLaunchTask": "compile",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
},
]
}

tasks.json

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "compile",
"command": "g++",
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}

事实上现在已经可以正常调试了,并且现在可以按 ctrl+shift+b 直接调用配置好的 task 编译而不运行程序,类似于一些 IDE 的编译选项

测试一下,新建一个.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]<<' ';
}

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/0d52ef06-892f-4cab-930e-5c716225db4d.jpeg

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

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/b1235de9-ea94-4375-bec0-6519161c16c0.jpeg

顶部六个按钮分别代表

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

集成终端在底部终端栏输入数据,如果是希望像 vs2019 一样,启动调试后显示外部窗口而不是在 vscode 集成终端进行调试

只需将launch.json中的"externalConsole"后面的值由 false 改为 true

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/93618825-87c7-494a-9e92-47bae82d0dab.jpeg

在单步调试的过程中我们可以添加监视来实时监视变量或表达式值的变化

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/714c453a-5316-4ba8-9c18-e8ee2cfd40cf.jpeg

也可以在调试控制台中输入想获取结果的变量名或者表达式获得当前的值

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/4d2fe4ce-9925-4fab-9134-91597c479bf8.jpeg

或者直接将鼠标光标移动到变量位置上,会自动显示当前变量的值

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/44fa221f-6616-427b-8c50-b392d959ce4d.jpeg

如果数组开得过大或者是一些结构较复杂的类或结构体,查询或显示值可能会导致调试程序崩溃

强调:调试是属于工作区设置,当前配置的调试环境只会对当前. vscode 文件夹所在路径下的文件生效,如果要换用别的文件夹,可以直接把. vscode 这个文件夹拷贝过去

补充

类似于 code runner 的问题

如果是需要有额外的编译指令如-lwsock32, 需要调试前事先在 tasks.json 的args处添加上对应的指令, 或者用 // 注释掉 launch.json 中的 preLaunchTask:“compile”(启动调试前执行编译任务) 这一项, 然后自己编译好后再执行调试,也可以直接使用 cmake

找不到头文件问题

对于安装了 vs2019 却使用 mingw 的情况,这时 vscode 代码检测会默认使用 vs2019 的 msvc 编译器的头文件,如果你使用 mingw 独有的特殊头文件会报找不到头文件的错误。

鼠标移动到报错头文件会显示一个灯泡,点击,选编辑 “includePath” 设置,然后在指定编译器下拉列表中选择 gcc 或者 g++

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/dd4e8715-f89b-46be-85d2-5c76aa76722f.jpeg

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/1e6eeadb-58a4-4ed6-bfe9-6029091af0f8.jpeg

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 显示一堆空白

windows%2010%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20vscode%20%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95%20C%20C++%2075499ad4d6be4c8bae999a3a02e52fed/7bd1d13a-0103-485b-bc3c-9cecf681a448.jpeg

解决方法:唐铭:移除 vscode 集成终端启动时显示的多余信息

更加完美的解决方法:唐铭:PowerShell 美化及自定义

后记

文章的核心内容均参考微软官方文档 mingw 部分

https://code.visualstudio.com/docs/cpp/config-mingw

在评论区或者私信里向我提问的人,大部分问题我都会在摸鱼时回复,但对于文章里已经写的很明白的以及抄别人文章有问题(不是一个两个了)跑来问我的,我一般是不回复的

相关内容

唐铭: Windows Terminal 终端入门唐铭:vscode wsl 入门唐铭:Linux 上使用 vscode 编译运行和调试 C/C++


windows 10 上使用 vscode 编译运行和调试 C/C++
https://fulequn.github.io/2023/05/Article202305151/
作者
Fulequn
发布于
2023年5月15日
许可协议