写在正文前面:
从我17年开始使用VSCode至今,只用过VSCode一次来写C++代码,光是调试环境就花了一下午的功夫,然后,就有了一次刻骨铭心的记忆,就是今年3月做数据结构课设的时候,那个时候还不会用可视化界面,就写了个C++控制台程序,鏖战了4天,终于达成了千行代码成就(就一个破学生兴趣管理系统写了这么多行实在惭愧QAQ),之后就爱上了VSCode,用它写代码真的是酣畅淋漓的体验。
咳咳,不扯了,从那时查阅网上资料,我从自己copy网上教程配置文件顺利使用至今以来一直再到昨天重新帮一位学弟调试 VSCode 环境来写C时出现的一堆让我一脸懵圈的问题为止,我都没有好好去研究一下这两个配置文件,一直以来都是复制粘贴别人的,运气好哪个能用就用哪个(其实用的就是下面这个)
@bat67 https://blog.csdn.net/bat67/article/details/76095813
所以昨天就用这个教程打发走了学弟,今天一个人好好研究了一番,通过猜测和尝试,终于把那些个问题的根源找到了,于是就有了这篇文章。
下面直接进入正题吧。
常见问题
-
t a s k {task} task参数
问题:命令传递的不是文件
解决方法:注意检查 args 参数是否为 “${file}”
问题:执行的命令不是 g++
解决方法:检查 command 参数是否为 “g++” -
l a u n c h {launch} launch参数
问题:miDebugger 路径错误
解决方法:检查 miDebugger 参数是否定位到 “MinGW\\bin\\gdb.exe” (注意是双斜杠) -
环境变量
问题:环境变量没有配置正确
解决方法:此电脑 -> 属性 -> 高级系统设置 -> 环境变量 -> 系统变量 -> 选择 Path 编辑 -> 新建或编辑一条 Path (目录应定位到 MinGW\bin 下)
-
启动路径
问题:launch.json 中的 program 生成路径 与 task.json 中传递命令的启动路径 不一致
解决方法:保持一致即可
路径字符串变量
接下来讲讲这两个路径 以及他们要用到的字符串变量
// Available variables which can be used inside of strings.
// ${workspaceRoot}: 工作区目录
// ${file}: 所打开文件的所在目录+全名
// ${fileBasename}: 所打开文件的全名
// ${fileDirname}: 所打开文件的所在目录
// ${fileExtname}: 所打开文件的扩展名
// ${fileBasenameNoExtension}: 所打开文件的无扩展文件名
// ${cwd}: 调试程序时的工作目录
这些变量用于两个配置文件,简单来说,
-
l a u n c h . j s o n {launch.json} launch.json 中的 program 参数 填写的字符串 是 .exe 文件的生成路径
-
t a s k . j s o n {task.json} task.json 中传递到命令的启动路径参数 args[i] 填写的字符串 是 .exe 文件的启动路径
两者必须保持一致,且必须追加到文件名,否则无法生成或者正常启动 .exe 文件。
假如VSCode的工作区位于E:\VSCode,源文件位于 E:\VSCode\testFile.cpp,则相应字符串变量的值为:
-
${workspaceRoot} = “E:\VSCode”
-
${fileDirname} = “E:\VSCode”
-
${file} = “E:\VSCode\testFile.cpp”
-
${fileBasename} = “testFile.cpp”
-
${fileExtname} = “.cpp”
-
${fileBasenameNoExtension} = “testFile”
现在需要生成 .exe 进行调试 则配置相应字串有以下情况:
-
“${fileDirname}/${fileBasenameNoExtension}.exe”
用此字串生成的 program 为文件所在目录下的 testFile.exe(跟随于文件)
效果见下图
-
“${workspaceRoot}/${fileBasenameNoExtension}.exe” 或 “${fileBasenameNoExtension}.exe”
用此字串生成的 program 为工作区目录下的 testFile.exe(全部位于 VSCode 目录下)
效果见下图:
当然,我们知道 “${file}” = “${fileDirname}” + “${fileBasename}”,所以也可以简化为这种配置字串
-
“${file}.exe”
用此字串生成的 program 为文件所在目录下的 testFile.cpp.exe(跟随于文件)
效果见下图
我们发现这种情况生成 .exe 时附加了源文件的后缀(逼死强迫症系列),这是因为 file Basename 没有 with NoExtension,不过不影响我们调试。
这几种情况都可以正常调试,只不过文件生成路径不同,读者可以自行选择自己喜欢的方案。
本文结束!
-----10分钟后更新-----
另外关于 c _ c p p _ p r o p e r t i e s . j s o n {c\_cpp\_properties.json} c_cpp_properties.json,以前我拿别人的代码配置之后未能解决 ,因为路径根本就找不到,文件中有一个 include 少拼写一个e,纠正之后也无效,但是也不影响程序的调试,代码一样可以跑,后来就没用 VSCode 写过C了,也就一直没有解决 include 绿色波浪的问题(就是 includePath 的问题)
目前不做这个配置 system(“pause”) 同样可以正常使用,见下图(貌似是更新之后不需要自行配置)
其实防止程序闪退的方法很简单,用VSCode自带的断点调试功能即可,如下图
更新完毕!
-----35天后更新-----
关于
l
a
u
n
c
h
.
j
s
o
n
{launch.json}
launch.json 和
t
a
s
k
.
j
s
o
n
{task.json}
task.json 的路径字符串一致问题,以下特意截取了
t
a
s
k
.
j
s
o
n
{task.json}
task.json 的执行过程,便于理解
这条指令的意思是,调用 C:\Program Files\MinGW\bin 目录下的 g++.exe 编译器程序 执行 -g 编译命令对 E:\VSCode\C_C++ 目录下的 Timer.c 文件进行编译,并通过执行 -o 命令生成了 Timer.exe
更新完毕!