261

Microsoft 的Visual Studio Code编辑器相当不错,但它没有默认支持构建 C++ 项目。

我如何配置它来做到这一点?

4

14 回答 14

169

有一种更简单的方法来编译和运行 C++ 代码,无需配置:

  1. 安装代码运行器扩展
  2. 在文本编辑器中打开您的 C++ 代码文件,然后使用快捷方式Ctrl+Alt+N,或按F1然后选择/键入Run Code,或右键单击文本编辑器然后单击Run Code上下文菜单,代码将被编译并运行,输出将显示在输出窗口。

此外,您可以根据需要使用不同的 C++ 编译器更新 settings.json 中的配置,C++ 的默认配置如下:

"code-runner.executorMap": {
    "cpp": "g++ $fullFileName && ./a.out"
}
于 2016-11-13T05:27:12.420 回答
92

构建任务是项目特定的。要创建新项目,请在 Visual Studio Code 中打开一个目录。

按照此处的说明,按Ctrl+ Shift+ P,键入Configure Tasks,选择它并按Enter

tasks.json 文件将被打开。将以下构建脚本粘贴到文件中,然后保存:

{
    "version": "0.1.0",
    "command": "make",
    "isShellCommand": true,
    "tasks": [
        {
            "taskName": "Makefile",

            // Make this the default build command.
            "isBuildCommand": true,

            // Show the output window only if unrecognized errors occur.
            "showOutput": "always",

            // Pass 'all' as the build target
            "args": ["all"],

            // Use the standard less compilation problem matcher.
            "problemMatcher": {
                "owner": "cpp",
                "fileLocation": ["relative", "${workspaceRoot}"],
                "pattern": {
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        }
    ]
}

现在转到菜单FilePreferencesKeyboard Shortcuts,并为构建任务添加以下键绑定:

// Place your key bindings in this file to overwrite the defaults
[
    { "key": "f8",          "command": "workbench.action.tasks.build" }
]

现在,当您按下F8Makefile 时,将执行,错误将在编辑器中加下划线。

于 2015-05-15T22:06:18.247 回答
55

新 2.0.0 tasks.json 版本的 makefile 任务示例。

在下面的一些评论中,我希望它们有用。

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "<TASK_NAME>",
            "type": "shell",
            "command": "make",
            // use options.cwd property if the Makefile is not in the project root ${workspaceRoot} dir
            "options": {
                "cwd": "${workspaceRoot}/<DIR_WITH_MAKEFILE>"
            },
            // start the build without prompting for task selection, use "group": "build" otherwise
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": false,
                "panel": "shared"
            },
            // arg passing example: in this case is executed make QUIET=0
            "args": ["QUIET=0"],
            // Use the standard less compilation problem matcher.
            "problemMatcher": {
                "owner": "cpp",
                "fileLocation": ["absolute"],
                "pattern": {
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        }
    ]
}
于 2017-10-01T08:28:09.273 回答
16

这是我为 C++ 配置 VS 的方式

确保将适当的路径更改为安装 MinGW 的位置

启动.json

{
   "version": "0.2.0",
   "configurations": [
       {
           "name": "C++ Launch (GDB)",                
           "type": "cppdbg",                         
           "request": "launch",                        
           "targetArchitecture": "x86",                
           "program": "${workspaceRoot}\\${fileBasename}.exe",                 
           "miDebuggerPath":"C:\\mingw-w64\\bin\\gdb.exe", 
           "args": [],     
           "stopAtEntry": false,                  
           "cwd": "${workspaceRoot}",                  
           "externalConsole": true,                  
           "preLaunchTask": "g++"                    
           }
   ]
}

任务.json


{
    "version": "0.1.0",
    "command": "g++",
    "args": ["-g","-std=c++11","${file}","-o","${workspaceRoot}\\${fileBasename}.exe"],
    "problemMatcher": {
        "owner": "cpp",
        "fileLocation": ["relative", "${workspaceRoot}"],
        "pattern": {
            "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
            "file": 1,
            "line": 2,
            "column": 3,
            "severity": 4,
            "message": 5
        }
    }
}

c_cpp_properties.json

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceRoot}",
                "C:/mingw-w64/lib/gcc/x86_64-w64-mingw32/7.2.0/include/c++",
                "C:/mingw-w64/lib/gcc/x86_64-w64-mingw32/7.2.0/include/c++/x86_64-w64-mingw32",
                "C:/mingw-w64/lib/gcc/x86_64-w64-mingw32/7.2.0/include/c++/backward",
                "C:/mingw-w64/lib/gcc/x86_64-w64-mingw32/7.2.0/include",
                "C:/mingw-w64/lib/gcc/x86_64-w64-mingw32/7.2.0/include/c++/tr1",
                "C:/mingw-w64/x86_64-w64-mingw32/include"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "__GNUC__=6",
                "__cdecl=__attribute__((__cdecl__))"
            ],
            "intelliSenseMode": "msvc-x64",
            "browse": {
                "path": [
                    "${workspaceRoot}",
                    "C:/mingw-w64/lib/gcc/x86_64-w64-mingw32/7.2.0/include/c++",
                    "C:/mingw-w64/lib/gcc/x86_64-w64-mingw32/7.2.0/include/c++/x86_64-w64-mingw32",
                    "C:/mingw-w64/lib/gcc/x86_64-w64-mingw32/7.2.0/include/c++/backward",
                    "C:/mingw-w64/lib/gcc/x86_64-w64-mingw32/7.2.0/include",
                    "C:/mingw-w64/lib/gcc/x86_64-w64-mingw32/7.2.0/include/c++/tr1",
                    "C:/mingw-w64/x86_64-w64-mingw32/include"
                ]
            },
            "limitSymbolsToIncludedHeaders": true,
            "databaseFilename": ""
        }
    ],
    "version": 3
}

参考:</p>

  1. 用于 VS 代码的 C/C++

  2. c_cpp_properties.json 模板

于 2018-03-21T06:18:06.187 回答
14

要在 VS 代码中构建/运行 C++ 项目,您需要手动配置位于工作区文件夹中.vscode文件夹中的tasks.json文件。要打开tasks.json,按ctrl + shift + P,然后输入Configure tasks,然后按enter,它将带你到tasks.json

这里我为我的tasks.json文件提供了一些注释,使文件更容易理解,可以作为配置tasks.json的参考,希望对你有用

任务.json

{
    "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}\\build\\${fileBasenameNoExtension}",    //output file name
                "&&",   //to join building and running of the file
                "${workspaceFolder}\\build\\${fileBasenameNoExtension}"
            ],
            "group": {
                "kind": "build",    //defines to which group the task belongs
                "isDefault": true
            },
            "presentation": {   //Explained in detail below
                "echo": false,
                "reveal": "always",
                "focus": true,
                "panel": "shared",
                "clear": false,
                "showReuseMessage": false
            },
            "problemMatcher": "$gcc"
        },
        
    ]
}

现在,直接从VS 代码任务文档中说明

类型属性说明:

  • type:任务的类型。对于自定义任务,这可以是 shell 或进程。如果指定了 shell,则命令被解释为 shell 命令(例如:bash、cmd 或 PowerShell)。如果指定了进程,则命令被解释为要执行的进程。

可以使用 tasks.json中的presentation属性来控制终端的行为。它提供以下属性:

  • 揭示:控制是否将集成终端面板置于前面。有效值为: -总是- 面板总是放在前面。这是默认设置 -从不- 用户必须使用“视图”>“终端”命令 (Ctrl+`) 将终端面板显式置于前面。-静默- 仅当未扫描输出以查找错误和警告时,才会将终端面板置于前面。

  • focus:控制终端是否获取输入焦点。默认为假。

  • echo:控制执行的命令是否在终端中回显。默认为真。

  • showReuseMessage:控制是否显示“终端将被任务重用,按任意键关闭它”消息。

  • panel:控制终端实例是否在任务运行之间共享。可能的值有: - shared:终端是共享的,其他任务运行的输出被添加到同一个终端。- dedicated:终端专用于特定任务。如果再次执行该任务,则重新使用终端。但是,不同任务的输出显示在不同的终端中。-:该任务的每次执行都使用一个新的干净终端。

  • clear:控制在运行此任务之前是否清除终端。默认为假。

于 2019-06-04T17:51:17.537 回答
11

由于缺乏清晰的文档而感到沮丧,我在 github 上创建了一个 Mac 项目,它应该可以正常工作(构建和调试):

vscode-mac-c-示例

请注意,它需要 XCode 和 VSCode Microsoft cpptools 扩展。

我计划对 Windows 和 linux 做同样的事情(除非微软先写出体面的文档......)。

于 2017-05-09T14:49:45.180 回答
9

首先,转到扩展(Ctrl + Shift + X)并安装2个扩展:

  1. 代码运行器
  2. C/C++

然后,然后重新加载 VS Code 并选择右上角的播放按钮,您的程序在输出终端中运行。您可以通过 Ctrl + Alt + N 查看输出。要更改其他功能,请转到用户设置。 在此处输入图像描述

于 2019-11-20T16:20:12.523 回答
7

这里的基本问题是构建和链接 C++ 程序在很大程度上取决于所使用的构建系统。您将需要使用插件和自定义代码的某种组合来支持以下不同的任务:

  1. 编辑器的通用 C++ 语言支持。这通常是使用 ms-vscode.cpptools 完成的,大多数人希望它还能处理很多其他的东西,比如构建支持。让我为您节省一些时间:它没有。但是,无论如何,您可能会想要它。

  2. 构建、清理和重建任务。这就是您选择构建系统的地方。你会找到像 CMake 和 Autoconf 之类的插件(上帝帮助你),但是如果你使用像 Meson 和 Ninja 这样的东西,你将不得不编写一些帮助脚本,并配置一个自定义的“tasks.json”文件来处理这些。在过去的几个版本中,微软已经完全改变了该文件的所有内容,直到它应该被称为什么以及它可以去的地方(是的,placeS),更不用说完全改变格式了。更糟糕的是,他们一直保持向后兼容性,以确保使用“版本”键来指定您想要的变体。在此处查看详细信息:

https://code.visualstudio.com/docs/editor/tasks

...但注意与以下冲突:

https://code.visualstudio.com/docs/languages/cpp

警告:在下面的所有答案中,以低于 2.0.0 的“版本”标签开头的任何内容都已过时。

这是我目前最接近的东西。请注意,我将大部分繁重的工作都交给了脚本,这并没有真正给我任何我可以忍受的菜单条目,并且没有任何好的方法可以在调试和发布之间进行选择,而无需在其中添加另外三个显式条目这里。综上所述,这是我目前可以容忍的 .vscode/tasks.json 文件:

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build project",
            "type": "shell",
            "command": "buildscripts/build-debug.sh",
            "args": [],

            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                // Reveal the output only if unrecognized errors occur.
                "echo": true,
                "focus": false,
                "reveal": "always",
                "panel": "shared"
            },

            // Use the standard MS compiler pattern to detect errors, warnings and infos
            "options": {
                "cwd": "${workspaceRoot}"
            },
            "problemMatcher": {
                "owner": "cpp",
                "fileLocation": ["relative", "${workspaceRoot}/DEBUG"],
                "pattern": {
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        },
        {
            "label": "rebuild project",
            "type": "shell",
            "command": "buildscripts/rebuild-debug.sh",
            "args": [],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                // Reveal the output only if unrecognized errors occur.
                "echo": true,
                "focus": false,
                "reveal": "always",
                "panel": "shared"
            },

            // Use the standard MS compiler pattern to detect errors, warnings and infos
            "options": {
                "cwd": "${workspaceRoot}"
            },
            "problemMatcher": {
                "owner": "cpp",
                "fileLocation": ["relative", "${workspaceRoot}/DEBUG"],
                "pattern": {
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        },
        {
            "label": "clean project",
            "type": "shell",
            "command": "buildscripts/clean-debug.sh",
            "args": [],

            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                // Reveal the output only if unrecognized errors occur.
                "echo": true,
                "focus": false,
                "reveal": "always",
                "panel": "shared"
            },

            // Use the standard MS compiler pattern to detect errors, warnings and infos
            "options": {
                "cwd": "${workspaceRoot}"
            },
            "problemMatcher": {
                "owner": "cpp",
                "fileLocation": ["relative", "${workspaceRoot}/DEBUG"],
                "pattern": {
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        }
    ]
}

请注意,理论上,如果您将该文件放在工作区根目录中,该文件应该可以工作,这样您就不会将隐藏目录(.vscode)中的文件检查到您的修订控制系统中。我还没有看到它真正起作用。对其进行测试,但如果失败,请将其放入 .vscode 中。无论哪种方式,如果 IDE 无论如何都不存在,它就会变得很糟糕。(是的,目前,这意味着我被迫将 .vscode 签入 subversion,我对此并不满意。)请注意,我的构建脚本(未显示)只是使用以下命令创建(或重新创建)一个 DEBUG 目录我的案例,介子,并在其中构建(在我的案例中,使用忍者)。

  1. 运行、调试、附加、停止。这些是另一组任务,在“launch.json”中定义。或者至少他们曾经是。微软已经对文档进行了这样的哈希处理,我什至不确定了。
于 2019-03-12T12:13:07.393 回答
5

以下是我使用 g++ 编译器为 C++ 配置 VS 的方法,它工作得很好,包括调试选项:

任务.json 文件

{
    "version": "0.1.0",
    "command": "g++",
    "isShellCommand": true,
    // compiles and links with debugger information
    "args": ["-g", "-o", "hello.exe", "hello.cpp"],
    // without debugger information
    // "args": ["-o", "hello.exe", "hello.cpp"],
    "showOutput": "always"
}

启动.json 文件

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "C++ Launch (Windows)",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceRoot}/hello.exe",
            "MIMode": "gdb",
            "miDebuggerPath": "C:\\MinGw\\bin\\gdb.exe",
            "stopAtEntry": false,
            "cwd": "${workspaceRoot}",
            "externalConsole": false,
            "visualizerFile": "${workspaceRoot}/my.natvis"
        }
    ]
}

我还在 VS Code 中安装了“C/C++ for Visual Studio Code”扩展

于 2016-11-17T15:37:10.830 回答
5

如果您的项目具有 CMake 配置,那么设置 VSCode 非常简单,例如tasks.json如下设置:

{
    "version": "0.1.0",
    "command": "sh",
    "isShellCommand": true,
    "args": ["-c"],
    "showOutput": "always",
    "suppressTaskName": true,
    "options": {
        "cwd": "${workspaceRoot}/build"
    },
    "tasks": [
        {
            "taskName": "cmake",
            "args": ["cmake ."]
        },
        {
            "taskName": "make",
            "args" : ["make"],
            "isBuildCommand": true,
            "problemMatcher": {
                "owner": "cpp",
                "fileLocation": "absolute",
                "pattern": {
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        }
    ]
}

这假定build工作空间的根目录中有一个带有 CMake 配置的文件夹。

还有一个CMake 集成扩展,它向 VScode 添加了“CMake build”命令。

PS!这problemMatcher是为clang-builds 设置的。要使用 GCC,我相信您需要更改fileLocationrelative,但我尚未对此进行测试。

于 2016-09-03T09:48:48.943 回答
4

使用更新的 VS Code,您可以通过以下方式执行此操作:

  1. 点击(Ctrl+ P)并输入:
ext install cpptools
  1. 打开一个文件夹 ( Ctrl+ K& Ctrl+ O) 并在文件夹内创建一个扩展名为.cpp的新文件(例如:hello.cpp):

  2. 输入您的代码并点击保存。

  3. 点击 ( Ctrl+ Shift+P并键入,Configure task runner然后other在列表底部选择。

  4. 在同一文件夹中创建一个名为build.bat的批处理文件,并将以下代码包含在文件正文中:

@echo off
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64     
set compilerflags=/Od /Zi /EHsc
set linkerflags=/OUT:hello.exe
cl.exe %compilerflags% hello.cpp /link %linkerflags%
  1. 编辑task.json文件如下并保存
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "0.1.0",
    "command": "build.bat",
    "isShellCommand": true,
    //"args": ["Hello World"],
    "showOutput": "always"
}
  1. 点击 ( ++Ctrl运行构建任务。这将为项目创建.objShift.exe文件。B

  2. 为了调试项目,点击F5并选择C++(Windows)

  3. launch.json文件中,编辑以下行并保存文件:

"program": "${workspaceRoot}/hello.exe",
  1. F5
于 2017-07-07T21:08:52.580 回答
3

可以使用 Extension Code Runner在右上角运行带有播放图标的代码,并通过快捷键:Ctrl++和中止Alt++ 。但默认情况下,它只显示程序的输出,但要接收输入,您需要执行一些步骤:NCtrlAltM

Ctrl+,然后设置菜单打开,扩展>运行代码配置向下滚动其属性并在 settings.json 中找到编辑单击它并在其中添加以下代码:

{
 "code-runner.runInTerminal": true
}
于 2019-09-17T20:07:50.797 回答
2

您可以参考这个具有2.0.0Visual Studio Code 版本任务的最新要点,https://gist.github.com/akanshgulati/56b4d469523ec0acd9f6f59918a9e454

您可以轻松编译和运行每个文件,而无需更新任务。它是通用的,还可以打开终端以输入条目。

于 2017-11-16T19:18:38.730 回答
0

现在有来自 Microsoft 的 C/C++ 语言扩展。您可以通过转到“快速打开”的东西 ( Ctrl+ p) 并键入以下内容来安装它:

ext install cpptools

你可以在这里读到它:

https://blogs.msdn.microsoft.com/vcblog/2016/03/31/cc-extension-for-visual-studio-code/

截至 2016 年 5 月,这是非常基本的。

于 2016-05-10T19:35:10.280 回答