vscode 运行C++

本文先介绍了windows下 VSCODE运行C++前,搭建C++运行环境的必要步骤。后介绍了tasks.jsonlaunch.json的作用,并给出了自己使用的配置方案。最后给出了常见问题的解决措施。

1- 环境搭建

在安装VScode后,还需要:

  • 添加C/C++插件。
  • 下载\MinGW,并添加相应的\MinGW\bin到系统环境变量中。
  • 在工程目录下的.vscode目录下,添加task.jsonlunch.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选项。
vscode 运行C++_第1张图片

  • 若需要在launch中需要编译,那就需要加载tasks,使用"preLaunchTask": "Build", preLaunchTask的属性值为tasks.jsonlabel的属性值。
  • 启动项名称由name控制。

想要更具体的了解task.jsonlaunch.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 了,但编译通过,但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以管理员方式运行。

你可能感兴趣的:(工具,vscode,c++,编辑器)