C++ 如何编译和运行c++;VisualStudio代码中的源文件

C++ 如何编译和运行c++;VisualStudio代码中的源文件,c++,visual-studio-code,C++,Visual Studio Code,我一直在寻找这个问题的答案,但似乎找不到答案。我知道我们可以使用task.json文件来自动化构建过程。但是我想使用VisualStudio代码来实现C++中的竞争编程算法。我希望能够编译一个程序,并在没有任何错误的情况下一次性运行它。如果有错误,我希望显示它们 另外,VisualStudio代码附带了一个集成终端,因此如果程序输出可以重定向到那里,那就太好了。 另外,我们如何映射键盘快捷键来运行此任务 我正在Windows 10上使用Visual Studio代码2019和MinGW G++编

我一直在寻找这个问题的答案,但似乎找不到答案。我知道我们可以使用task.json文件来自动化构建过程。但是我想使用VisualStudio代码来实现C++中的竞争编程算法。我希望能够编译一个程序,并在没有任何错误的情况下一次性运行它。如果有错误,我希望显示它们

另外,VisualStudio代码附带了一个集成终端,因此如果程序输出可以重定向到那里,那就太好了。 另外,我们如何映射键盘快捷键来运行此任务

我正在Windows 10上使用Visual Studio代码2019和MinGW G++编译器

编辑

我在下面尝试了Escape0707的答案,并尝试使用默认键绑定
Ctrl+Alt+N
执行
“运行代码”
,但我遇到了这个错误

更新的方法,该方法结合了
make
vscode-cpptools
调试: 如果您不关心VSCode集成调试工具,它将为您提供设置断点、在运行时更改变量值、检查变量值等功能,并且您想要一种更简单、更快、透明的方式来调用好的旧命令行工具,跳过此部分并签出下面的
code Runner

默认配置是用VSCODE C++扩展的,对于低端机器来说是慢的。最糟糕的是,它们总是会重建您的可执行文件,并且。下面是Linux(当然还有远程WSL)的解决方案

要解决第一个问题,您需要设置
make
(对于简单的一个源文件编译,您只需要安装make)来构建源代码,并在
tasks.json
中设置构建任务。要解决第二个问题,请创建另一个任务,以便在第一个任务完成后运行生成的可执行文件:

使用Intellisense了解配置中的每个属性

tasks.json

{
//看https://go.microsoft.com/fwlink/?LinkId=733558
//有关tasks.json格式的文档
“版本”:“2.0.0”,
“介绍”:{
“清楚”:正确,
“聚焦”:没错,
“面板”:“共享”
},
“任务”:[
{
“标签”:“创建活动文件”,
“类型”:“外壳”,
“命令”:“制作”,
“args”:[“${fileBasenameNoExtension}.out”],
“problemMatcher”:“$gcc”,
“集团”:{
“种类”:“建造”,
“isDefault”:正确
}
},
{
“标签”:“在不调试的情况下运行活动文件可执行文件”,
“类型”:“外壳”,
“命令”:“${fileDirname}/${fileBasenameNoExtension}.out”,
“介绍”:{
“清除”:错误
}
},
{
“标签”:“在不调试的情况下生成并运行活动文件”,
“集团”:{
“种类”:“测试”,
“isDefault”:正确
},
“dependsOn”:[
“创建活动文件”,
“运行活动文件可执行文件而不进行调试”
],
“dependsOrder”:“序列”
}
]
}
要以这种方式启用使用VSCode的调试,首先确保在
Makefile
中向
cxflags
添加了
-g
编译标志

有关如何编写
Makefile
的快速信息,请参阅、或。或者检查答案的最后一部分

然后,创建以下
launch.json

launch.json

{
//使用IntelliSense了解可能的属性。
//悬停以查看现有属性的描述。
//有关更多信息,请访问:https://go.microsoft.com/fwlink/?linkid=830387
“版本”:“0.2.0”,
“配置”:[
{
“名称”:“生成并调试活动文件”,
“类型”:“cppdbg”,
“请求”:“启动”,
“程序”:“${fileDirname}/${fileBasenameNoExtension}.out”,
“cwd”:“${workspaceFolder}”,
“设置命令”:[
{
“说明”:“为gdb启用漂亮打印”,
“文本”:”-启用漂亮打印“,
“忽略失败”:正确
}
],
“预启动任务”:“${defaultBuildTask}”
}
]
}
现在,您可以使用命令调色板尝试
任务:运行生成任务
任务:运行测试任务
调试:开始调试


原始答案

请考虑一下,因为它似乎比VSCode的内置调试程序更快(对于我来说),可以用于许多小型C++代码文件的练习。我将描述如何使用该扩展来满足类似的需求

  • 确保已将
    路径
    配置为包含
    clang++
    ,以便可以从集成终端调用它。 您也可以使用
    g++
    将下面的
    clang++
    替换为
    g++
    。我更喜欢<代码> CLAN++<代码>,因为它对像我这样的C++初学者提供了更严格的检查。
  • 安装扩展插件
  • 在VSCODE的<代码>设置中。JSON < /代码>,请考虑添加以下条目:
    “代码运行程序.clearPreviousOutput”:true,
    “code runner.preserveFocus”:false,
    “code runner.runinternal”:true,
    “代码运行程序.saveFileBeforeRun”:true
    
  • 并将最后一个自定义
    code runner.executomap
    添加到用户/工作区设置,该设置描述当当前文件名的扩展名满足指定的扩展名时,您希望扩展名发送到终端的命令。例如:
    “代码运行程序.executomap”:{
    “cpp”:“\b\b\b\b\b\b\b\b\bclang++-std=c++17$fileName-o a.out&&./a.out”
    },
    
    上面的设置告诉扩展名,“当看到
    .cpp
    文件时,向终端发送10个退格(以删除任何键入错误的字符),并调用
    clang++-std=c++17*文件名*-o a.out&&./a.out
    。 我在Linux机器上使用此命令,对于Windows,请尝试将输出文件的文件扩展名更改为
    .exe
    ,并使用
    \a.exe
    o调用它
    CXX = clang++
    CXXFLAGS = -std=c++17 -g -Weverything -Werror
    
    %.out: %.cpp
        $(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@
    
    {
        "version": "2.0.0",
    
        "tasks": [
    
            {
                "label": "build & run",     //It's name of the task , you can have several tasks 
                "type": "shell",    //type can be either 'shell' or 'process' , more details will be given below
                "command": "g++",   
                "args": [
                    "-g",   //gnu debugging flag , only necessary if you want to perform debugging on file  
                    "${file}",  //${file} gives full path of the file
                    "-o",   
                    "${workspaceFolder}\\${fileBasenameNoExtension}",    //output file name
                    "&&",   //to join building and running of the file
                    "${workspaceFolder}\\${fileBasenameNoExtension}"
                ],
                "group": {
                    "kind": "build",    //defines to which group the task belongs
                    "isDefault": true
                },
                "presentation": {   
                    "echo": false,
                    "reveal": "always",
                    "focus": true,
                    "panel": "shared",
                    "clear": false,
                    "showReuseMessage": false
                },
                "problemMatcher": "$gcc"
            },
    
        ]
    }