本文先介绍了windows下 VSCODE运行C++前,搭建C++运行环境的必要步骤。后介绍了tasks.json
、launch.json
的作用,并给出了自己使用的配置方案。最后给出了常见问题的解决措施。
1- 环境搭建
在安装VScode后,还需要:
- 添加
C/C++
插件。 - 下载
\MinGW
,并添加相应的\MinGW\bin
到系统环境变量中。 - 在工程目录下的
.vscode
目录下,添加task.json
和lunch.json
文件。 - 准备好
main.cpp
文件后,点击F5
即可实现运行。
不了解这个过程的话,可以查看ZHIHU: Visual Studio Code 如何编写运行 C、C++ 程序?.
2- 例子
看例子前,请先了解:
tasks可以被用来做编译,通过F1→run task
来运行编译任务。
在tasks.json
中,你将在这里设置:(部分罗列)
- 编译任务的名称,如
"label": "Build",
- 哪些源文件(.cpp)一起编译成一个可执行文件,生成可执行文件的名称。
- 可执行文件是否用于调试。
launch 用来运行结果,包括但不限于run、debug、compile。可通过F5
运行最近的launch选项,在左边调试栏或左下角选择具体的launch选项。
- 若需要在launch中需要编译,那就需要加载tasks,使用
"preLaunchTask": "Build",
,preLaunchTask
的属性值为tasks.json
中label
的属性值。 - 启动项名称由
name
控制。
想要更具体的了解task.json
、launch.json
和》json
,可参考:vscode官网
官网中对面向具体编程语言的一些可选项属性的说明较少,只能是参见其他博客了。
给出自己用的文件:
lunch.json:
// launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch",
"preLaunchTask": "Build",
"type": "cppdbg",
"request": "launch",
"program": "${env:windir}\\System32\\cmd.exe",
"args": [
"/C","${workspaceFolder}/main.exe", "&", "pause"
],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"miDebuggerPath": "C:/Program Files/CodeBlocks/MinGW/bin/gdb.exe",//根据本地路径修改
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
},
{
"name": "DBG",
"preLaunchTask": "Build",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/main.exe",
"args": [ ],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "C:/Program Files/CodeBlocks/MinGW/bin/gdb.exe",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
tasks.json:
{
"version": "2.0.0",
"tasks": [
{
"label": "Build", // 任务的名字叫Build,注意是大小写区分的,等会在launch中调用这个名字
"type": "shell", // 任务执行的是shell命令,也可以是
"command": "g++", // 命令是g++
"args": [
"'-Wall'", "-g",
"'-std=c++17'", //使用c++17标准编译
"${workspaceFolder}/*.cpp", //当前文件名
"-o", //对象名,不进行编译优化
"'main.exe'", //当前文件名(去掉扩展名)
],
// 所以以上部分,就是在shell中执行(假设文件名为filename.cpp)
// g++ filename.cpp -o filename.exe
"group": {
"kind": "build",
"isDefault": true
// 任务分组,因为是tasks而不是task,意味着可以连着执行很多任务
// 在build组的任务们,可以通过在Command Palette(F1) 输入run build task来运行
// 当然,如果任务分组是test,你就可以用run test task来运行
},
"problemMatcher": [
"$gcc" // 使用gcc捕获错误
],
}
]
}
3- 问题汇总
下面不显示整个文件,只列出相关属性及值,提供检查。
3.1- 结果在cmd中显示
launch.json
下:
"program": "${env:windir}\\System32\\cmd.exe",
"args": [
"g++","/C","${fileDirname}/${fileBasenameNoExtension}.exe", "&", "pause"
],
"externalConsole":true
反之,若要直接运行a.exe,并在vscode中显示,则:
"program": "${fileDirname}/${fileBasenameNoExtension}.exe",
"args": [],
3.2- cmd运行结束后闪退
launch.json
下:
运行前都加断点:
"stopAtEntry": false,
运行结束后暂停:
"args": ["/k", "${fileDirname}\\${fileBasenameNoExtension}.exe", ],
或者:
"args": [
"g++","/C","${fileDirname}/${fileBasenameNoExtension}.exe", "&", "pause"
],
3.3- 多文件,且总是从main.exe
运行
在tasks.json
文件下:
"command": "g++", // 命令是g++
"args": [
"'-Wall'",
"'-std=c++17'",
"${workspaceFolder}/*.cpp",
"-o",
"'main.exe'",
],
在launch.json
文件下
"program": "${fileDirname}/main.exe",
3.4- 无法调试:
在launch.json
文件:
"MIMode": "gdb",
"miDebuggerPath": "c:/MinGW/bin/gdb.exe",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}]
可执行文件中,还需要添加调试信息,断点设置才会生效。
在tasks.json
,即:
"args": [ "g++", "-g",```];
编译和显示问题
Q: 符号编码与乱码问题
A: 详见我的另一篇博客符号编码与乱码问题
Q: 程序include <thread>
了,但编译通过,但CMD无输出。双击out.exe
输出 无法定位程序输入点 ZNSt6thread15 M Sta rt threadESt10unique ptrINS 6 StateESt14defa ult deleteIS1 EEPFvvE 于动态链接库 C:WsersXFunnyZhangXDocumentsXVsCodeCppXtest.exe 上 。
A: 我把C:\mingw64\bin
环境变量加到了用户变量
中,而不是系统变量
中。vscode下编译时可以从用户变量中读取,但运行可执行程序时,可执行程序获取不到响应的thread动态库。因此只要把环境变量改到系统变量
中即可。
Q:无法将“g++”项识别为 cmdlet、函数、脚本文件或可运行程序的名称?[-]
A: 排除没有将g++添加到环境变量的问题后,可将vscode以管理员方式运行。