本文将介绍在 Windows 平台使用 VSCode 开发 C/C++ 程序所需的环境部署流程。

声明在先,推荐在 Windows 平台使用微软提供的 Visual Studio 开发 C/C++ 程序。作为一款集成开发测试环境,VS 极大简化了开发者配置环境的需求,基本实现了零配置开发流程。不过由于 Visual Studio 属于重型开发工具,体量大、冷启动速度慢,在涉及简单的代码内容调整时并没有什么优势;同时,Visual Studio 仅支持 Windows 环境,在使用 macOS 和 Linux 时将无法体验,所以会有使用小型编辑器开发 C/C++ 的需求。

Visual Studio Code 是 Visual Studio 系列的一款小型编辑器,是由微软主导的一个开源项目。VSCode 是基于 JavaScript 开发的,工作在 NodeJS 引擎。VSCode 同时支持 Windows/Linux/mac OS,支持插件扩展,有庞大的生态环境圈。

安装软件

使用 VSCode 开发 C/C++ 程序,顾名思义,需要使用到 VSCode 和 C/C++ 编译器。考虑到 VSCode 是跨平台的,那么在 C++ 编译器上优先考虑 GNU C++。

Visual Studio Code

可以在 https://code.visualstudio.com/ 处下载最新版的 VSCode 安装包。

GCC C++

GNU 是一项促进开源环境发展的开发项目,由 GNU 提供的程序编译器统称为 GCC(the GNU Compiler Collection)。GCC 早期仅支持 C 语言,经过长时间的发展,现已成为包含 C/C++/Objective-C/Fortran/Ada/Go 编译器和配套开发支持库在内,同时支持各处理器架构汇编语言的大型开源项目。GCC 被诸多类 UNIX 操作系统(Linux/BSD/Mac OS)采纳为标准编译器,在 Windows 操作系统上也可使用。需要注意的是,GCC 使用 GPL 协议。

在 Windows 平台上使用 GCC C++,需要在 http://www.mingw.org/ 下载最新的 MinGW Installation Manager,通过这个程序联网下载最新的编译器和库文件。使用 Chrome 等浏览器打开该网站时,可能会报不安全警告,可以在警告页下方选项中找到类似“继续访问该网站”字样的链接即可点击访问。

GCC C++ 安装在本地时,尽量不要存放在路径中含有中文的目录内,以免造成不必要的错误。

在使用 MinGW 选择需要安装的编译器时,至少需要选中 MinGW-GCC-bin/ MinGW-GDB-bin/ MinGW-GCC-G++-bin,其他的语言和标准库的支持可视情况自选安装。

修改环境变量

在使用 GCC C++ 前,需要将其在本地的存储路径纳入到系统的环境变量中,便于其他程序直接通过程序名调用。在 Windows 操作系统中,需要在 控制面板->系统->“高级系统设置”(侧边栏)->“环境变量”选项卡 中进行修改。

Windows 10 版本的用户,可以在环境变量选项中进行新建操作。需要注意的是:Windows 10 以下版本的用户是在原有数据后补充数据,需要在原环境变量路径后方补充英文分号后,方可添加新的地址。在操作时容易误将新路径覆盖到原始数据上,造成不必要的系统错误,故操作时务必小心谨慎。

Hello World

在以上基础内容准备完毕后,可以写一个简单的程序进行测试了。本文主题不在于介绍 C/C++ 程序,故仅采用 Hello World 用于测试:

  /* main.c */
  #include <stdio.h>
  #include <stdlib.h>

  int main()
  {
    printf("Hello World!");
    return 0;
  }

除了 C,还可以使用 C++。这是 CPP 程序样例:

  // main.cpp
  #include <iostream>
  using namespace std;

  int main()
  {
    cout << "Hello World!";
    return 0;
  }

配置项目

C/C++ Extension

Microsoft 为解决 C/C++ 程序在 VSCode 上的代码高亮、语法检查和调试问题,提供了官方维护的 C/C++ 扩展插件。这一插件应优先安装。

安装插件可以使用 ctrl + shift + X 组合键,在搜索框输入 C/C++,即可查询到并下载安装。

这个 C/C++ 扩展插件是开源的,阅读源代码、提交 Issues 和 Pull Requests,请访问 https://github.com/Microsoft/vscode-cpptools/

配置编译任务

使用 VSCode 进行程序编译,需要创建和管理“任务”。“任务”是指预订的、有条件触发的脚本、命令和它们的集合。

新建一个任务,使用组合键 ctrl + shift + P,在命令行中输入 Tasks: Configure Task,查询到对应项目后回车即可。

以下是一个 C/C++ 编译任务的参考样例:

  {
    "version": "2.0.0",
    "tasks": [
      {
        "label": "build main",
        "type": "shell",
        "command": "g++",
        "args": ["-g", "${file}", "-o", "${workspaceRoot}/main.exe"],  
        "group": {
          "kind": "test",
          "isDefault": true
        }
      }
    ]
  }

tasks.label 是当前任务的名称(标签、标识符),用于在其他脚本中进行调用。在本例中使用 shell 类型,使用命令为 g++,命令的参数按数组形式依次输入。其中的 ${file}${workspaceRoot} 是作为变量使用,会根据实际执行任务的文件情况进行填充。main.exe 仅作为样例提供,可以根据实际需要修改,在进行下一小节设置时需要保持一致。

group.kind 可选值有 test 和 build 两个,根据实际情况进行选择即可。

配置调试信息

VSCode 对项目进行调试,需要生成并完善一份项目配置。在这份配置文件中需要说明程序的整体情况,需要执行的任务和使用什么解释器、编译器来完成任务。

生成配置文件,使用组合键 ctrl + shift + P,在命令行中输入 Debug: Open launch.json,查询到对应项目后回车即可。如果项目已有 launch.json 文件,将会被自动打开以供编辑,如缺失这一文件则会进行自动创建操作。

以下是一个基础功能的配置样例:

  {
    // 使用 IntelliSense 了解相关属性。 
    "version": "0.2.0",
    "configurations": [      
      {
        "name": "(gdb) Launch",
        "type": "cppdbg",
        "request": "launch",
        "program": "${workspaceFolder}/main.exe",
        "args": [],
        "stopAtEntry": false,
        "cwd": "${workspaceFolder}",
        "environment": [],
        "externalConsole": true,
        "MIMode": "gdb",
        "miDebuggerPath": "C:\\MinGW\\bin\\gdb.exe",
        "setupCommands": [
          {
            "description": "Enable pretty-printing for gdb",
            "text": "-enable-pretty-printing",
            "ignoreFailures": true
          }
        ],
        "preLaunchTask": "build main"
      }
    ]
  }

关于其中的参数 MIMode/miDebuggerPath 等,需要根据实际情况进行修改。特别是 miDebuggerPath 参数,需要按 MinGW 安装的路径来填写。

需要注意的是,在预任务 preLaunchTask 属性中填写的任务名,须于上一小节中的任务名一致;在 program 属性中给出的程序路径须与上一小节中生成的路径一致,否则会返回错误。

在 VSCode 当中调试程序,VSCode 会自动查询当前活动的目录是否存在 .vscode 子目录及其中的配置文件;如不存在,将会向其上级目录进行查询,如此往复,直至查询到驱动器目录后,若依旧不存在则提示新建配置文件。由这项规则,在实际开发过程中,可以将使用同语言的工程放置在同一目录下,并在这个目录中生成和管理配置文件;这样可以实现维护一份配置文件但同时满足所有名下项目调试和编译的需求。

当采用上述方式管理配置文件时,不能将配置文件中的重要信息(如工作目录和路径相关)进行硬编码,而需要使用变量进行管理。这就是前例中 ${workspaceFolder} 的情况。

测试

到此为止,所有必要的配置工作都已结束。可以在调试面板中对之前的设置进行一次测试。调试面板的组合键为 ctrl + shift + P,这一选项需在使用 VSCode 打开文件夹时方才有效。

样例中使用的代码在实际执行时会一闪而过,在体验测试时需要设置断点,或使用诸如此类的代码:

  // main.cpp
  int main() 
  {
    cout << "Hello World!" << endl;
    cin.get();
    cin.get();
    return 0;
  }