最近在使用VSCode编译C++,其中遇到了一些坑,便在此做一些解决的记录。我使用的编译器是MinGw。
坑1:按下F5运行时提示如下:
文字版提示为:
Unable to start debugging. Program path '***.exe' ismissing or invalid.
GDB failed with message: "***.exe": not inexecutable format: File format not recognized
This may occur if the process's executable was changed after the process wasstarted, such as when installing an update. Try re-launching the application orrestarting the machine.
这个错误我百度了好多资料,均没有找到相关信息。后来看了下这个项目下./vecode/task.json。发现了这么一句:
上面那一行注释是我自己写的,下面这个红框的内容是配置项自己生成的,幺蛾子就是出在了这儿。
把红框的内容替换为上面那一行即可,但是要注意路径问题,不同的机器的配置路径可能不一致
坑2:
文字版描述为:
launch: program '*****\.vscode\launch.exe' does not exist
出现这个问题的原因是误把launch.json当成C++编译了,VSCode貌似默认编译的是当前活动标签,只需把活动标签切到目标CPP即可。验证如下:
坑3:使用LeetCode插件时,代码在VSCode中各种标红,(多一句废话:这个题解代码我是抄的别人的)如下:
这个可能并不是很严重,只是针对于有强迫症的人群(比如我自己)。有的在本地VSCode中标红,提交的时候却能通过编译。问题在于少了这两行代码:
#include<bits/stdc++.h>
using namespace std;
如下问题解决了:
补充于2020年6月15,坑4:VSCode不支持C++11,百度上所有的方法都试过没啥用。
我换了电脑遇到了这个坑,怎么用百度的解决方法都不对,我重装了一次,结果还是没啥用。然后怀疑是.vscode文件夹下那两个json的问题,于是我把之前的json文件全部删除了,再次编译时选择了下图的第一个,然后按照网上的教程在arg参数里加了个"-std=c++11",即可成功支持c++11了(注意是两个json文件:launch.json文件个和ask.json文件里对应的arg参数都要添加,网上有的说只在launch.json中添加,我亲测了下,好像不行,编译报错)。之前可能是选择了下图的Windows那个选项,无论如何在个json文件的arg参数中添加"-std=c++11"都不好使。
或者可以手动在打开的目录下新建.vscode文件夹,并在.vscode文件夹下添加launch.json和tasks.json。我自己成功的配置如下:
launch.json内容如下:
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations":
[
{
"name": "g++.exe - 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true, //这个指定是否需要开新的终端窗口,如果为false,倒是可以支持打印中文
//为true时C++代码中打印中文时会乱码
"MIMode": "gdb",
"miDebuggerPath": "D:\\MinGW\\bin\\gdb.exe",
//上面这一行替换成自己的路径,一般需要安装MinGw编译器或者其他编译器,然后把gdb.exe路径放进来,注意此处是两个反斜杠
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++.exe 生成活动文件"
}
]
}
task.json内容如下:
{
"tasks": [
{
"type": "shell",
"label": "C/C++: g++.exe 生成活动文件",
"command": "D:\\MinGW\\bin\\g++.exe", //记得将此处换成自己的路径,和launch.json中的gdb在同一个目录中
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"-std=c++11"
],
"options": {
"cwd": "D:\\MinGW\\bin"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
可即使这样,我能编译源文件生成exe文件,他丫的还是有坑。我的代码用到的函数如果没有前置声明,编译终端还是报错(是的,即使exe都生成了还是报编译错误)真是醉了,我也不知道为啥。需要安装的插件如下图:
基本安装这些插件之后,就可以正常编译运行C++的代码了。
坑五:VSCode项目下就只有个launch.json文件,没有task.json文件。
这个是由于在配置项目时候,只是点了一次生成和调试活动文件。我自己测试得出的结论是:第一个生成的 是launch.json文件,第三个生成的是task.json 文件。我的生成和调试活动文件点击后界面如下:
我针对的都是g++的编译器而言的,由于cpp.exe的相关配置没有试过,不敢妄谈。有时候只有个launch.json文件程序也能编译运行,但有时候就不行。例如,2020.7.1之前我就只有个launch.json文件就能编译运行,但是自从那天上午更新了之后,就不行了。尤其是涉及到c++11标准的一些东西,更新后编译各种报错(在命令行手动编译倒是能通过编译生成exe文件,但是这手动输入哪有一键生成香啊)。后来自己就测试了下上图中的第一个g++和第三个g++,然后得出了选项和文件之间的对应关系。
注意,有的朋友可能已经生成了一个launch.json后就找不到打开上图的界面从而无法生成task.json文件,编译又报错(起初我也是这样),这时候你随便新建一个cpp文件,然后打开,单击鼠标右键,就会出现下图的提示,点进去就能找到对应的选项。
需要支持c++11的参照网上的方法:在task.json下添加“-std=c++11”,但是,注意不要分割了下图框起来的这两行,否则又生成不了exe文件。
坑五:VSCode无法使用万能头文件<bits/stdc++.h>
我遇到这个原因是因为自己的电脑上既装了Visual studio企业版,又装了MInGW的编译器。所以这个仅供参考一下。Visual studio是一个集成开发环境,编译器和调试器以及include路径全部都有了,但是就是不支持万能头文件,当时我还以为是自己的环境变量设置错了,折腾了一晚上。第二天看了知乎一张帖子(后面会将链接放在参考链接处),就怀疑可能是VSCode使用的是Visual Studio企业版的include路径而不是我想使用的MinGW里的include路径。试了下果真生效了。具体操作如下:
ctrl+shift+p然后搜索下图:
选择UI模式,然后选择下图(注意一定要在这之前配置好MinGW的环境变量):
然后载设置最后一项:
至此,我就能使用MinGw的万能头文件了
坑五参考链接:Windows下配置VSCode使用mingw-w64的gcc、g++编译器和GDB调试器 - 知乎 (zhihu.com)
送个小彩蛋——配置MinGW的环境变量:
其实编译器和调试器的路径配置很简单,但是不好整的是include路径的配置,这个玩意儿不好设置,我的环境变量设置如下,只是能用,但是不一定是最简单或者最好的设置方法:
添加下面这两行到环境变量里面就行了:
D:\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++
D:\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\x86_64-w64-mingw32\bits
注意前面的D:\MinGW\lib\这一块要换成自己的路径