0%

vscode中Cpp配置和调试方法

这个话题网上有很多说法,csdn上的教程也很多,但是我看了大多数的教程,大部分是win,且是老版本的vscode,每个人的情况不同,配置的信息不同,我的这个教程也不一定能够包含所有的情况,所以还是以参考为主

首先就是扩展插件部分安装C/C++插件,Chinese simplify等等插件,这两个就够用,可以根据需求装C/C++ Extention和code runner等

MAC版

一、c_cpp_properties.json

command + shift + p或者左下角设置->命令面板,输入C/C++,选择Edit Configuration(UI),

image-20241201175307715

image-20241201175607677

在这幅图片中要确保编译器路径IntelliSense模式这两个配置是符合你的电脑要求的,编译器路径部分g++是C++的编译器,gcc是c语言的编译器,IntelliSense默认就行。

在设置完这些后,会出现一个c_cpp_properties.json文件,是你刚刚配置的相关信息,具体代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"configurations": [
{
"name": "Mac",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"macFrameworkPath": [
"/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks"
],
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "macos-clang-arm64",
"compilerPath": "/usr/bin/g++"
}
],
"version": 4
}

可以看到这里的编译器是xcode自带的g++。

二、launch.json

左上角点击运行->添加配置...,这时会出现一个launch.json文件,点击这个文件右下角的添加配置,选择{}C/C++: (lldb)启动(这里和win不同,mac只有lldb启动)

image-20241201180107718

image-20241201180251558

image-20241201180420945

一开始的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": "(lldb) 启动——生成调试文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}", // 当前文件的输出路径
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "lldb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++ 生成活动文件"
}
]
}

有几点需要注意:

  1. name是右侧调试列出现的名称,如下图

image-20241201180639449

  1. program是当前文件的输出路径,${fileDirname}/${fileBasenameNoExtension}表示在当前文件的目录下生成一个名字和cpp文件名字一样的可执行文件(如test.cpp生成test),注意这是mac版,不需要加后缀名。
  2. stopAtEntry,这一项控制是否在入口处暂停,默认false不暂停
  3. externalConsole,这一项控制是否启动外部控制台(独立的黑框)运行程序,默认false表示在集成终端中运行
  4. preLaunchTask,调试前的预执行任务,这里的值是tasks.json文件中对应的编译任务
  5. cwdcwdCurrent Working Directory(当前工作目录)的缩写。它指定了调试时程序的工作目录,也就是程序运行时查找文件和相对路径的起始目录。只有这个配置对了,类似${fileDirname}/${fileBasenameNoExtension}这种才不会出现问题

其他的默认就好

三、tasks.json

左上角点击终端->配置任务...,这里提示用模版创建,这里由于我没有现成的任务模版,只能自己新建一个tasks.json

image-20241201181237025

image-20241201181556832

image-20241201181617332

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
{
"tasks": [
{
"type": "shell",
"label": "C/C++: g++ 生成活动文件", // 编译任务的名称,跟上面preLaunchTask的值对应
"command": "/usr/bin/g++", // g++路径
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
}
}
],
"version": "2.0.0"
}

注意一下几点:

  1. type,这里是shell表明我是在终端运行的(也就是zsh)
  2. label,编译任务的名称,跟上面preLaunchTask的值一致
  3. command,这里是系统的c++编译器路径
  4. args${file}表示在当前文件下运行,即要点击到对应运行的cpp文件下,点击开始绿色箭头的开始与调试. ${fileDirname}/${fileBasenameNoExtension}表示生成的文件的路径和名称,注意这个要和launch.json中的program一致
  5. cwd,重要性见launch.json所述。

其他默认就好

四、运行和调试

配置好上面三个文件后(在.vscode文件夹里,默认隐藏,在访达中command + shift + .即可显示,在vscode中海会自动创建),在右侧选择运行和调试,选择到对应的要编译运行的cpp文件下,注意如果有多个cpp文件需要同时编译,修改tasks.json中的args即可。点击运行与调试旁边的“绿色箭头”,就可以成功运行。

image-20241201183536753

结果如下 image-20241201183753942

如果不习惯调试控制台输出,把externalConsole改为true即可.

五、解决终端将被任务重用,按任意键关闭的问题

在上面的叙述中,如果每一步都按照我的来,最终会在集成终端中出现“终端将被任务重用,按任意键关闭”的字样。这个还好,如果只是简单的输出程序,还可以在调试控制台中看到,但是如果是包含输入相关的程序(如cin),那么程序会被彻底阻塞。你无法在调试控制台输入,更没法在集成终端中输入(因为集成终端只会显示终端任务将被重用、或者生成已完成等等字样,按任意键就会关闭)。

这时你或许还可以把launch.json中的externalConsole改成true,但是这样会使你在全屏显示的情况下,每次都要跳回到桌面显示终端得到结果,而不能简单的在集成终端中显示。

解决方案如下: 在vscode插件中下载一个CodeLLDB扩展,如下图所示

image-20241202142825996

通过访问其github官网https://github.com/vadimcn/codelldb/blob/v1.11.1/MANUAL.md

有这么一段 Starting a New Debug Session

1
2
3
4
5
6
7
{
"name": "Launch",
"type": "lldb",
"request": "launch",
"program": "${workspaceFolder}/<executable file>",
"args": ["-arg1", "-arg2"],
}

这时,你只需要把<executable file>部分换成你的输出文件即可,如${fileBasenameNoExtension},参数部分不需要,cwd可以是${workspaceFolder},也可以是${fileDirname},我的具体配置如下(将之前的注释掉即可)

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
34
{
"version": "0.2.0",
"configurations": [
{
"type": "lldb",
"request": "launch",
"name": "Launch",
"program": "${workspaceFolder}/${fileBasenameNoExtension}",
"args": [],
"cwd": "${workspaceFolder}",
"preLaunchTask": "C/C++: g++ 生成活动文件"
}
// {
// "name": "(lldb) 启动——生成调试文件",
// "type": "cppdbg",
// "request": "launch",
// "program": "${fileDirname}/${fileBasenameNoExtension}",
// "args": [],
// "stopAtEntry": false,
// "cwd": "${fileDirname}",
// "environment": [],
// "externalConsole": false,
// "MIMode": "lldb",
// "setupCommands": [
// {
// "description": "为 gdb 启用整齐打印",
// "text": "-enable-pretty-printing",
// "ignoreFailures": true
// }
// ],
// "preLaunchTask": "C/C++: g++ 生成活动文件"
// }
]
}

注意,上面这一部分代码也可以通过launch.json文件右下角的添加配置...中选择{}CodeLLDB : launch来直接配置

另外,这里要自己加上preLaunchTask,这样就能确保在调试之前能够先执行tasks.json中的任务(也就是编译生成可执行文件),紧接着则集成终端中调试即可,结果如下 image-20241202143555768

现在,你可以尽情用mac来写c++代码了!

补充一个有意思的问题:这篇文章原来的题目是:vscode中C++配置和调试方法,我在hexo g的时候会报错如下 image-20241202151915830

可能是node_modules中的hexo-asset-img这个包的index.js没有正确处理标题中含有++这种的情况,吧++改成pp就能够正常hexo g

-------------本文结束感谢您的阅读-------------