如何设置Visual Studio Code来编译C ++代码?


222

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

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


12
在Linux下编译C ++代码有很多答案,但是Windows呢?
Charles Milette

5
这种基本的东西,但是在Windows中没有有用的资源可以做到这一点。还有ms cpptools扩展,不要说了。我想这只会增加您的挫败感。它什么也没做。
Kshitij

有人找到解决方案吗?我可以编译,但不能在VSCode上调试C / C ++。文章说,调试只能在Linux上的支持。最近我也为这个创建了这个线程。将感谢所有帮助...
Mahesha999

Answers:


133

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

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

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

"code-runner.executorMap": {
    "cpp": "g++ $fullFileName && ./a.out"
}

4
我的输出窗口停留在running blablabla。没有提示,什么都没有。我如何停止代码运行?
Hichigaya Hachiman

11
要停止运行代码,请使用Ctrl+Alt+M。要使用stdin读取数据,可以转到File-> Preference-> Settings设置"code-runner.runInTerminal": true。有关更多详细信息,您可以参考github.com/formulahendry/vscode-code-runner/issues/91
Jun Han

1
在输出窗口中运行会阻止端子输入。runInTerminal似乎是必需的……
安德鲁·沃尔夫

得到一个错误-“错误:#include中的文件
名为

9
您应该披露自己是您要推广的扩展程序的作者。
编码

86

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

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

task.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时,将执行该操作,并且错误将在编辑器中加下划线。


8
警告-此文件的格式已更改,这不再正确。请参阅:go.microsoft.com/fwlink/?LinkId=733558
断点

默认密钥ctrl+alt+b用于构建任务。
危险89年

是否有命令或绑定会跳转到终端中的下一个/上一个错误?我遇到的情况是“问题”窗格有很多不相关的问题(因为VS Code并不真正知道如何构建我的项目,而且讲授它的方式也太投入了),但是我的“终端”编译后充满有用的错误。我只需要键盘快捷键即可跳到“终端”中的下一个错误...
Dan L

47

新2.0.0版task.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
                }
            }
        }
    ]
}

2
仍是截至2018年11月的最新信息。谢谢!
TheIntern

您将其放置在哪个目录中?根是“ .vs”还是“ .vscode”?假设,如果文件也将进入修订控制(我强烈建议),则工作空间根目录是唯一推荐的位置,但是我无法使其正常工作。
断点

据我所知,目前唯一有效的地方是.vscode。对于git版本控制,一种可能性是使用.gitignore像这样的模式!.vscode/tasks.json
attona 2016年

14

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

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

launch.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++"                    
           }
   ]
}

task.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
}

参考:

  1. VS代码的C / C ++

  2. c_cpp_properties.json模板


13
也许您还想解释一下您的设置在做什么,而不仅仅是复制粘贴内容
uitty400 '18

2
我很难解释自己的设置。
李Ku

确保将正确的路径更改为您的MinGW的安装路径。
安东尼·雷

您也可以使用/ **递归包含子文件夹,而不是在"C:/mingw-w64/lib/gcc/x86_64-w64-mingw32/7.2.0/include"
Lorenz

10

要用VS代码构建/运行C ++项目,您需要手动配置task.json文件,该文件位于工作区文件夹的.vscode文件夹中。要打开task.json,请按ctrl + shift + P,然后键入配置任务,然后按Enter,它将带您进入task.json。

在这里,我为我的task.json文件提供了一些注释,以使该文件更易理解,它可以用作配置task.json的参考,我希望它会有用

task.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)。如果指定了process,则该命令将被解释为要执行的过程。

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

  • 显示:控制是否将集成终端面板置于前面。有效值为:

    • 始终 -面板总是放在最前面。这是默认值
    • 从不 -用户必须使用“视图”>“终端”命令(Ctrl +`)将终端面板显式显示在最前面。
    • 无声 -仅在不扫描输出中是否有错误和警告的情况下,才将终端面板置于前面。
  • focus:控制终端是否获取输入焦点。默认为false。

  • echo:控制是否在终端中回显执行的命令。默认为true。
  • showReuseMessage:控制是否显示“终端将被任务重用,请按任意键将其关闭”消息。
  • panel:控制是否在任务运行之间共享终端实例。可能的值为:
    • shared共享终端,并将其他任务运行的输出添加到同一终端。
    • 专用:终端专用于特定任务。如果再次执行该任务,则终端将被重用。但是,不同任务的输出将显示在不同终端中。
    • new:该任务的每次执行都使用新的干净终端。
  • clear:控制是否在运行此任务之前清除终端。默认为false。

9

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

vscode-mac-c-example

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

我计划在Windows和Linux上执行相同的操作(除非Microsoft首先编写体面的文档...)。


8

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

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

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


这是先前答案的重复。
JDługosz

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,但是我尚未对此进行测试。


5

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

task.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"
}

launch.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中安装了“ Visual Studio Code的C / C ++”扩展


我可以编译,但不能在VSCode上调试C / C ++。文章说,调试只能在Linux上的支持。最近我也为这个创建了这个线程。将感谢所有帮助...
Mahesha999

5

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

  1. 编辑器的常规C ++语言支持。通常,这是使用ms-vscode.cpptools完成的,大多数人希望它还能处理很多其他内容,例如构建支持。让我为您节省一些时间,事实并非如此。但是,您可能还是想要它。

  2. 生成,清理和重建任务。这是您选择构建系统的地方。您会找到诸如CMake和Autoconf之类的插件(上帝会帮助您),但是如果您使用的是Meson和Ninja之类的插件,则必须编写一些帮助程序脚本,并配置一个自定义的“ tasks.json”文件以处理这些。在最近的几个版本中,Microsoft完全更改了该文件的所有内容,直至应有的名称以及可以使用的位置(是,placeS),更不用说完全更改格式了。更糟糕的是,他们对SORT OF保持了向后兼容性,以确保使用“版本”键来指定所需的变体。在这里查看详细信息:

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仍然不存在,它都会bit之以鼻。(是的,目前,这意味着我被迫将.vscode签入Subversion,对此我感到不满意。)请注意,我的构建脚本(未显示)仅使用以下命令创建(或重新创建)DEBUG目录:我的情况,介子,并在其中建立(在我的情况下,使用忍者)。

  1. 运行,调试,附加,停止。这些是另一组任务,在“ launch.json”中定义。或者至少他们曾经是。微软对文档进行了这样的哈希处理,我什至不确定。

作为示例,这是build-scripts / build-debug.sh文件。理想情况下,它们将继承构建上下文(调试,发布,配置文件等),但是即使它具有概念,我也无法弄清楚Code是如何管理的。请原谅格式;去,StackOverflow,去。#!/ bin / bash如果[!-d“ DEBUG”]; 然后mkdir DEBUG介子DEBUG fi cd DEBUG ninja如果[$?-eq 0]; 然后退出0否则退出$?fi
断点

再次提醒您:在完成此操作后,按CTRL-SHIFT-B可拉出构建任务。我确实非常希望有一个适当的主菜单,其中包含所有这些内容,但是我还没有弄清楚该怎么做。
断点

4

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

  1. 点击(Ctrl+ P)并输入:

    ext install cpptools
    
  2. 打开一个文件夹(Ctrl+ KCtrl+ O),并在扩展名为.cpp的文件夹内创建一个新文件(例如:hello.cpp):

  3. 输入您的代码,然后点击保存。

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

  5. 在名为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%
    
  6. 如下编辑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"
    }
    
  7. 点击(Ctrl+ Shift+ B运行Build任务。这将为项目创建.obj.exe文件。

  8. 要调试项目,请点击F5并选择C ++(Windows)

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

    "program": "${workspaceRoot}/hello.exe",
    
  10. F5


我正在使用最新的VSC。您在步骤4迷失了我。配置任务运行器不可用。
路易


2

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

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

{ "code-runner.runInTerminal": true }


Ctrl +放大给我
MM

它是ctrl逗号而不是ctrl plus来打开设置
Ashley Fernandes

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.