本篇将会阐述配置 Visual Studio Code 以使用 mingw-w64 中的 GCC C++ 编译器 (g++) 和 GDB 调试器来创建在 Windows 上运行的程序。配置 VS Code 后,您将编译、运行和调试 Hello World 程序。

若你依然存留问题,请随时评论留言并留下邮箱提交问题。

先决条件:需要准备Visual Studio Code 以及 安装适用于 VS Code 的 C/C++ 扩展。您可以通过在 Extensions (扩展) 视图中搜索 'C++' (Ctrl+Shift+X) 来安装 C/C++ 扩展。

C/C++ 扩展


安装MINGW-w64工具链

通过MSYS2获取最新版本的工具链,它提供GCC,MinGW-w64和其他有用的C++工具和库的最新原生版本.提供编译代码、调试代码和配置代码以使用 IntelliSense 所需的工具.---( MSYS2 )

根据在向导中,选择所需的 Installation Folder。记录此目录以供以后使用。在大多数情况下,建议的目录是可以接受的。当您开始设置开始菜单快捷方式步骤时,这同样适用。完成后,确保选中 Run MSYS2 now 框,然后选择 Finish。这将为您打开 MSYS2 终端窗口。

在此终端中,通过运行以下命令安装 MinGW-w64 工具链:

pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain

按 Enter 键接受组中的默认包数。toolchain


MYSS2 安装程序


当系统提示是否继续安装时,输入Y

按照以下步骤将 MinGW-w64 文件夹的路径添加到 Windows 环境变量中:binPATH

    1. 在 Windows 搜索栏中,键入 设置 以打开您的 Windows 设置。

    2. 搜索 Edit environment variables (编辑环境变量) 对于您的账户。

    3. 在 User variables(用户变量)中,选择变量,然后选择 Edit(编辑)。Path

    4. 选择 全新 并添加 MinGW-w64 您在安装过程中记录的目标文件夹到列表中。如果您使用了上面的默认设置,则这将是路径:。C:\msys64\ucrt64\bin

    5. 选择 “确定”,然后在 “环境变量” 窗口中再次选择 “确定” 以更新环境变量。 您必须重新打开任何控制台窗口才能使用更新的环境变量。PATHPATH

检查您的 MinGW 安装

要检查您的 MinGW-w64 工具是否已正确安装并可用,请打开一个新的命令提示符并键入:

gcc --version
g++ --version
gdb --version


看到输出,说明您安装了哪些版本的 GCC、g++ 和 GDB。如果不是这种情况:

确保您的 PATH 变量条目与安装工具链的 MinGW-w64 二进制位置匹配。如果该 PATH 条目中不存在编译器,请确保按照前面的说明进行操作。

如果输出正确但未正确,则需要安装 MinGW-w64 工具集中缺少的软件包。gccgdb

如果在编译时收到“The value of miDebuggerPath is invalid.”消息,一个原因可能是您缺少包。mingw-w64-gdb


创建 Hello World 应用程序

首先,让我们设置一个项目。

启动 Windows 命令提示符(在 Windows 搜索栏中输入 Windows 命令提示符)。

运行以下命令。这些将创建一个空文件夹,名为 where you can place your all VS Code projects.在那里,下一个命令将创建并导航到名为 .从那里,您将直接在 VS Code 中打开。projectshelloworldhelloworld

(若不熟悉命令行,可直接在桌面创建项目文件夹)


在完成本教程时,您将看到在工作区的文件夹中创建的三个文件:.vscode

  • tasks.json(构建说明)

  • launch.json(调试器设置)

  • c_cpp_properties.json(编译器路径和 IntelliSense 设置)

New File title bar button

简单的添加一个你好世界源代码,开启美滋滋的一天

# include<stdio.h>
int main() {
    printf("hello world!");
    return 0;
}

现在按 Ctrl+S 保存文件。请注意您刚刚添加的文件在 VS Code 侧栏的 File Explorer 视图 (Ctrl+Shift+E) 中的显示方式:

File Explorer


您还可以启用 自动保存 以自动保存文件更改,方法是选择 File > Auto Save。您可以在 VS Code 用户界面文档中找到有关其他视图的更多信息。


注意:保存或打开 C++ 文件时,可能会看到来自 C/C++ 扩展的通知,告知 Insiders 版本的可用性,该版本允许你测试新功能和修补程序。您可以通过选择 (Clear Notification) 来忽略此通知。X

什么是 IntelliSense

IntelliSense 是一种工具,它通过添加代码编辑功能(如代码完成、参数信息、快速信息和成员列表)来帮助你更快、更高效地编写代码。

要查看 IntelliSense 的实际应用, 将鼠标悬停在 或 上可查看其类型信息。如果在第 10 行中键入,则可以看到建议调用的成员函数的完成列表,所有这些函数均由 IntelliSense 生成:vectorstringmsg.

Statement completion IntelliSense

如果尚未配置 IntelliSense,请打开命令面板 (Ctrl+Shift+P) 并输入“选择 IntelliSense 配置”。

运行 helloworld.cpp

C++ 扩展使用计算机上安装的 C++ 编译器来构建程序。在尝试在 VS Code 中运行和调试之前,请确保您已完成“安装 MinGW-w64 工具链”步骤。helloworld.cpp

    打开,使其成为活动文件。helloworld.cpp
  1. 按下编辑器右上角的 play 按钮。

Screenshot of helloworld.cpp and play button

从系统上检测到的编译器列表中选择 C/C++: g++.exe build and debug active file。

C++ debug configuration dropdown

系统只会在首次运行时要求您选择编译器。此编译器将在 file 中设置为 “default” 编译器。helloworld.cpptasks.json

构建成功后,程序的输出将出现在集成的 Terminal 中。

screenshot of program output

首次运行程序时,C++ 扩展会创建一个文件,您可以在项目的文件夹中找到该文件。 存储您的构建配置。tasks.json.vscodetasks.json

您的新文件应类似于下面的 JSON:tasks.json

{
    "version": "2.0.0",
    "tasks": [{
        "label": "Compile", // 任务名称,与launch.json的preLaunchTask相对应
        "command": "g++",   // 要使用的编译器,C++用g++
        "args": [
            "${file}",
            "-o",    // 指定输出文件名,不加该参数则默认输出a.exe,Linux下默认a.out
            "${fileDirname}/${fileBasenameNoExtension}.exe",
            "-g",    // 生成和调试有关的信息
            "-Wall", // 开启额外警告
            "-static-libgcc",     // 静态链接libgcc,一般都会加上
            "-fexec-charset=UTF-8", // 生成的程序使用GBK编码,不加这一条会导致Win下输出中文乱码
            // "-std=c++17", // C++最新标准为c++17,或根据自己的需要进行修改
        ], // 编译的命令,其实相当于VSC帮你在终端中输了这些东西
        "type": "process", // process是vsc把预定义变量和转义解析后直接全部传给command;shell相当于先打开shell再输入命令,所以args还会经过shell再解析一遍
        "group": {
            "kind": "build",
            "isDefault": true // 不为true时ctrl shift B就要手动选择了
        },
        "presentation": {
            "echo": true,
            "reveal": "always", // 执行任务时是否跳转到终端面板,可以为always,silent,never。具体参见VSC的文档
            "focus": false,     // 设为true后可以使执行task时焦点聚集在终端,但对编译C/C++来说,设为true没有意义
            "panel": "shared"   // 不同的文件的编译信息共享一个终端面板
        },
        // "problemMatcher":"$gcc" // 此选项可以捕捉编译时终端里的报错信息;但因为有Lint,再开这个可能有双重报错
    }]
}

 launch.json 

当使用播放按钮或 F5 进行调试时,C++ 扩展会动态创建动态调试配置。

在某些情况下,您需要自定义调试配置,例如指定要在运行时传递给程序的参数。您可以在文件中定义自定义调试配置。launch.json

要创建 ,请从播放按钮下拉菜单中选择 Add Debug Configuration。launch.json

C++ debug configuration dropdown

{
  "configurations": [
    {
      "name": "C/C++: g++.exe build and debug active file",
      "type": "cppdbg",
      "request": "launch",
      "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
      "args": [],
      "stopAtEntry": false,
      "cwd": "${fileDirname}",
      "environment": [],
      "externalConsole": false,
      "MIMode": "gdb",
      "miDebuggerPath": "C:\\msys64\\ucrt64\\bin\\gdb.exe",
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        },
        {
          "description": "Set Disassembly Flavor to Intel",
          "text": "-gdb-set disassembly-flavor intel",
          "ignoreFailures": true
        }
      ],
      "preLaunchTask": "C/C++: g++.exe build active file"
    }
  ],
  "version": "2.0.0"
}

在上面的 JSON 中,指定要调试的程序。此处,它设置为活动文件夹 () 和扩展名为 () 的活动文件名,如果是活动文件,则为 。该属性是在运行时传递给程序的参数数组。program${fileDirname}.exe${fileBasenameNoExtension}.exehelloworld.cpphelloworld.exeargs

默认情况下,C++ 扩展不会向源代码添加任何断点,并且该值设置为 .stopAtEntryfalse

将值更改为,以便在开始调试时调试器在方法上停止。stopAtEntrytruemain

从现在开始,在启动程序进行调试时,播放按钮和 F5 将从文件中读取数据。launch.json


如果您想对 C/C++ 扩展进行更多控制,您可以创建一个文件,该文件将允许您更改设置,例如编译器路径、包含路径、C++ 标准(默认为 C++17)等。c_cpp_properties.json

您可以通过从命令面板运行命令 C/C++:编辑配置 (UI) (Ctrl+Shift+P) 来查看 C/C++ 配置 UI。

Command Palette

这将打开 C/C++ Configurations 页面。在此处进行更改时,VS Code 会将其写入文件夹中调用的文件中。c_cpp_properties.json.vscode

在这里,我们将 Configuration name 更改为 GCC,将 Compiler path 下拉列表设置为 g++ 编译器,并将 IntelliSense 模式设置为匹配编译器 (gcc-x64)。

Command Palette

Visual Studio Code 将这些设置放在 中。如果直接打开该文件,它应该看起来像这样:.vscode\c_cpp_properties.json

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "10.0.17763.0",
            "compilerPath": "D:/MinGW/bin/g++.exe",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "windows-gcc-x64"
        }
    ],
    "version": 4
}

故障 排除

MSYS2 已安装,但仍未找到 g++ 和 gdb

您必须按照 MSYS2 网站上的步骤使用 MSYS CLI 安装完整的 MinGW-w64 工具链(),以及所有必需的先决条件。该工具链包括 g++ 和 gdb。pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain

作为 Windows 用户,运行 pacman 命令时出现错误

Windows 计算机上的 UCRT 仅包含在 Windows 10 或更高版本中。如果您使用的是其他版本的 Windows,请运行以下不使用 UCRT 的命令:

pacman -S --needed base-devel mingw-w64-x86_64-toolchainCopy

将 MinGW-w64 目标文件夹添加到环境变量列表时,默认路径将为:。C:\msys64\mingw64\bin

参考文档:Visual Studio Code 中的 C++ 和 MinGW-w64 入门