VSCode配置C++环境(Windows篇)

1. 本地软件安装

1.1 MinGW 编译套件

GCC官方提供的编译套件不能直接在 windows 上使用,推荐的解决方案是使用 MinGW。

MinGW 提供了一套简单方便的 Windows 下的基于 GCC 程序开发环境,并且 收集了一系列免费的 Windows 使用的头文件和库文件。它整合了 GNU 的工具集,特别是 GNU 程序开发工具,如经典 gcc, g++, make 等。
MinGW 是完全免费的自由软件,它在 Windows 平台上模拟了 Linux 下 GCC 的开发环境,为 C++ 的跨平台开发提供了良好基础支持,为了在 Windows 下工作的程序员熟悉 Linux 下的 C++ 工程组织提供了条件。

如果小伙伴本地安装了Qt,并且使用的编译套件也是 MingW,那么就不需要在安装了,配置一下环境变量即可。

Qt环境变量配置

如果本地没有,那就必须老老实实的下载一个了,下载地址如下:

MinGW官方下载地址: https://osdn.net/projects/mingw/

第一步, 运行下载到本地的 MinGW 下载器,准备编译套件的下载。

第二步: 给即将下载的编译套件指定存储路径

第三步: 下载前的准备。

第四步: 开始下载,将下图中的两项标记为下载,

勾选完成后,在菜单栏中选择Installation -> Apply Changes

弹出如下对话框,选择Apply。然后耐心等待,直至安装成功,即可关闭此界面。注意,整个安装过程中可能会提示某些组件下载失败,先关闭提示对话框,等下载完成之后, 按照最后一步处理一下即可。

最后一步,如果安装过程中某个包下载失败了可进程如下操作:

在菜单栏中选择Installation -> Apply Changes,再次进行安装就可以了。

可以通过 MinGW Installation Manager安装界面中的 All Packages选项查看没有安装成功的软件包。

1.2 CMake

CMake是一个跨平台的项目构建工具,它可以用简单的语句来描述所有平台的编译过程并输出各种各样的makefile或者project文件(如 Linux 的 Makefile 或 Windows Visual C++ 的 projects/workspaces)。最后调用编译器按照构建文件规则编译整个项目。

现在越来越多的开源项目都支持使用 CMake 进行项目构建,如果想要在 VSCode 搭建的C++开发环境中实现类似IDE的一键编译或者一键调试的效果,就可以依赖 CMake 来解决这个问题。

CMake 官方下载地址: https://cmake.org/download/

根据自己本地操作系统选择对应的版本,将绿色版 CMake 下载到本地,并解压缩到自己认为合适的目录中即可。

1.3 设置环境变量

不论是使用 MinGW 下载器下载到本地的编译套件,还是下载到本地的绿色版的 CMake 在对应的目录中都有一些可执行程序,默认这些可执行程序是不能被全局访问的,如果想要在任意目录中访问这些目录中的可执行程序,就需要将这些目录设置到系统的环境变量中,具体设置方式如下:

  1. 找到 MinGW 和 CMake 的本地目录(以我本地为例)

    1
    2
    1. MinGW 编译套件可执行程序对应的本地路径:C:\MinGW\bin
    2. CMake 的本地路径:C:\cmake\bin
  2. 依次右击计算机(此电脑) -> 属性 -> 高级系统设置 -> 环境变量

    查看图文演示

    用户级别的环境变量优先级大于系统级别的环境变量。

    1. 根据自己的需求,找到对应的 Path, 双击,在弹出的对话框中添加第一步中找到的两个路径

    2. 验证环境变量是否配置成功了:打开一个终端 (win + r 输入 cmd

      windows 中打开终端的方式很多,在此之上列举了其中一种。

2. vscode 插件安装

在 vscode 中编写 C/C++ 程序并搭建一个类似 IDE 的编译调试环境一共需要安装三个插件:C/C++, CMake, CMake Tools。首先需要基于 vscode 的扩展面板搜索插件名,找到插件之后,直接安装就可以。

  1. C/C++

  2. CMake

  3. CMake Tools

3. 单文件编译和调试

vscode 下单文件的编译调试只需要在本地部署好编译套件,并安装 C/C++插件就可以使用了,使用方法如下:

3.1 编译

vscode可以以目录为单位处理文件,因此我们首先创建一个目录,然后用vscode打开这个目录,在这个目录对应的工作区添加一个源文件,编写程序:

代码编写完毕之后,找到菜单栏的终端 ->新终端打开一个新的终端窗口,这个终端窗口就是Windows自带的 power shell,支持Linux 命令。

在得到的 Power Shell窗口中使用 gcc 编译源文件:

轻松搞定GCC
1
2
3
4
5
# 编译c源文件
$ gcc xxx.c -o 可执行程序名

# 编译C++源文件
$ g++ xxx.cpp -o 可执行程序名

这样在打开的工作区目录中就生成了一个叫做 app.exe的可执行程序。

3.2 调试

vscode的工具栏面板中有一个调试按钮,点击这个按钮,然后根据提示,将launch.json文件创建出来,这个文件中记录了一些用于调试的配置信息。(可以按照下图来操作也可以点按钮 运行和调试

在窗口顶部弹出的窗口中选择C++(GDB/LLDB)

选择编译器,因为在我本地有两个版本的 MinGW 编译套件,所有有两个选项,小伙伴根据自己配置的路径选择对应的编译套件中的编译器即可。如果源文件是.cpp, 此处显示的是 g++.exe ...................

如果vscode 加载不到编译器,会弹出如下窗口,需要选择 MinGW 套件中的 GCC 编译器,不要选 VS里边的编译器。

如果操作成功了,最后会看到生成了一个叫做 .vscode的目录, 并且里边有两个文件launch.jsontasks.json

如果生成的.vscode目录中只有launch.json没有tasks.json,是因为没有加载到工作区的源文件,需要执行如下操作:

  1. 删除生成的.vscode目录
  2. 先打开一个工作区的源文件,再重新执行添加launch.json的操作。

接下来 vscode 会自动生成调试的配置文件,并初始化。最后在需要调试的代码行前面(行号之前)用鼠标设置断点或者把光标放到某一行使用快捷键F9添加断点。

设置好断点之后,使用快捷键F5,或者通过菜单项运行 -> 启动调试就可以启动调试了,程序就会停到设置的断点位置,调试窗口中就可以显示变量信息了。如果是无断点调试可以使用快捷键Ctrl+F5

4. 多文件编译

如果一个项目中有多个源文件,进行项目编译有两种方式:通过命令编译, 通过CMake编译,后者是全自动化也不需要 gcc 基础,推荐使用。为了更贴近实际项目场景, 下面演示一个多目录场景的案例, 目录结构如下:

4.1 基于命令编译项目

首先打开一个终端(现有终端或者新的终端都可以),在 sort目录执行如下命令编译源文件

1
2
3
4
# C++程序编译
$ g++ src/insert.cpp src/select.cpp test.cpp -o sort -I ./include
# 编译 src 目录下所有的 .cpp 文件
$ g++ src/*.cpp test.cpp -o sort -I ./include

这样就生成了可执行程序 sort.exe

4.2 基于CMake编译

首先在源文件所在的工作区目录中添加一个CMake文件叫做 CMakeLists.txt,在这个文件中添加两句话

1
2
3
4
5
project(SortMake)
aux_source_directory(src SRC_SUB)
aux_source_directory(. SRC_CUR)
add_executable(sort ${SRC_SUB} ${SRC_CUR})
include_directories(include)
  • project() :设置项目名称,参数可以随意指定
  • aux_source_directory(dir VAR): 搜索 dir 目录下所有的源文件,并将结果列表存储在变量 VAR
  • add_executable(target src): 指定使用源文件src,生成可执行程序 target , ${变量名} 是取变量的值
  • include_directories(headDir): 设置包含的头文件目录

在vscode中先配置cmake, 按快捷键 ctrl+shift+p,在窗口中搜索 CMake configure,选中这个配置项

如果vscode 加载不到编译器,会弹出如下窗口,需要选择 MinGW 套件中的 GCC 编译器,不要选 VS里边的编译器。

CMake 配置完成之后, 会在vscode 工作区生成一个 build目录

打开终端,在终端中执行以下三个命令:

  1. 进入到生成的build目录

    1
    $ cd build
  2. 通过cmake工具基于编写的CMakeLists.txt生成MakeFile文件

    1
    $ cmake ..

    小贴士:

    build目录也可以删了再自己创建,如果是这样操作的并且电脑上已经安装了 vs 执行这一步会出错,需要使用 (cmake -G “MinGW Makefiles” ..)来代替(cmake ..),该操作只需要做一次,后边就可以直接使用 cmake .. 了,但是没有必要脱了裤子放屁,直接使用vscode创建的 build 目录就行了。

  3. 使用make工具通过生成的makefile文件构造项目。Linux中的构建工具叫make, 32位的MinGW中的构建工具叫做mingw32-make.exe, 64位的MinGW中的构建工具叫做mingw64-make.exe, 当前使用的构建工具是32位的。最终可执行程序就生成到build目录中了。

    1
    $ mingw32-make.exe
Makefile快速入门

最后看一下工作区的文件列表

5. 多文件调试

5.1 生成调试配置文件

不通过CMake进行可执行程序调试也是可以的,比较麻烦,还需要通过命令重新生成可用于调试的可执行程序,再修改配置文件,步骤比较繁琐,这里讲一下如何基于CMake进行配置并调试。

第一步: 先将 launch.json文件创建出来(一定要先切换到显示项目源文件的那个 Tab 页,不然 tasks.json创建不出来)。

第二步: 在窗口顶部弹出的窗口中选择C++(GDB/LLDB)

选择g++编译器,因为在我本地有两个 MingW环境,所以有两个 g++.exe 选项(选择哪个都行)

多文件项目还不能自动链接并编译项目, 需要手动修改配置文件, 因此会弹出这个对话框:

5.2 launch.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "g++.exe - 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "C:\\Qt\\Qt5.9.3\\Tools\\mingw530_32\\bin",
"environment": [],
"console": "externalTerminal",
"MIMode": "gdb",
"miDebuggerPath": "C:\\Qt\\Qt5.9.3\\Tools\\mingw530_32\\bin\\gdb.exe",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++.exe 生成活动文件"
}
]
}

这个配置文件中需要修改的项不太多, 介绍一下需要修改的配置项:

  • program: 要调试的可执行程序的路径,里边可以使用一些宏,宏的外部加 ${} 表示取值
    • ${fileDirname}:文件目录的名字,launch.json 对应的目录名就是 .vscode
    • ${fileBasenameNoExtension}:不带扩展名的文件名,文件名是main函数对应的那个文件
    • ${workspaceFolder}:工作区目录
  • preLaunchTask:调试项目前要执行的任务,C/C++: g++.exe 生成活动文件tasks.json中的一个任务
    • 通过执行这个任务生成了program对应的可执行文件

5.3 tasks.json

我们需要将原来 tasks.json中的内容清楚,使用下面的模板进行替换:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
"version": "2.0.0",
"options": {
"cwd": "${workspaceFolder}/build/"
},

"tasks": [
{
"label": "cmake",
"type": "shell",
"command": "cmake",
"args": [
".."
]
},
{
"label": "make",
"group":{
"kind":"build",
"isDefault":true
},
"command": "mingw32-make.exe",
"args":[
]
},
{
"label":"Build my project",
"dependsOn":[
"cmake",
"make"
]
}
]
}

下面解释一下文件中需要修改的一些设置项:

  • cwd:进入到工作区的子目录 build

    1
    2
    3
    "options": {
    "cwd": "${workspaceFolder}/build/"
    },
  • label: 标题, 可随意取名, 这里叫做 cmake

  • command: 要执行的命令是 cmake .. , 作用是使用 cmake 生成 makefile 文件

    1
    2
    3
    4
    5
    6
    7
    8
    {
    "label": "cmake",
    "type": "shell",
    "command": "cmake",
    "args": [
    ".."
    ]
    }
  • label: 标题, 可随意取名, 这里叫做 make

  • command: 要执行的命令是 mingw32-make.exe作用是使用 MinGW 编译套件中的这个工具基于 makefile 构建当前项目

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    {
    "label": "make",
    "group":{
    "kind":"build",
    "isDefault":true
    },
    "command": "mingw32-make.exe",
    "args":[
    ]
    }
  • label: 标题, 可以随意取名, 这里叫 Build my project。该名字需要作为 launch.jsonpreLaunchTask配置项的值

  • dependsOn: 需要执行的命令对应的 label

    1
    2
    3
    4
    5
    6
    7
    {
    "label":"Build my project",
    "dependsOn":[
    "cmake",
    "make"
    ]
    }

5.4 修改配置文件

根据对 tasks.json的解释, 可以知道最终使用MinGW的构建工具mingw32-make.exe通过 cmake生成的makefile编译整个项目得到的可执行程序存储到了工作区的build目录中,因此需要修改launch.jsonprogram的value值。

另外 launch.jsonpreLaunchTask配置项的值也需要和 tasks.json中最后一个 label的值相同。

第一处修改:

第二处修改:

恭喜:

如果各位小伙伴已经走到这一步,那么你的vscode已经和 IDE 无异了,每次使用快捷键F5(启动调试)或者Ctrl+F5(非调试模式运行),都可以重新编译项目并生成可以调试的可执行程序,我们可以快乐的写代码了。