首页 VSCode部署C/C++开发环境
文章
取消

VSCode部署C/C++开发环境

本文介绍了基于 VSCode 的 C/C++ 开发环境的搭建方法。


1. 简介

VSCode是微软推出的一款跨平台开源编辑器,凭借强大的第三方插件支持C/C++、Python、Java等众多语言,体积小巧功能丰富,适合小型工程项目的开发调试。下面简单介绍VSCode开发环境的部署。

注意,VSCode仅仅是一个前端文本编辑器,本质上与记事本并无不同,在没有插件和编译器的情况下只能进行文件的读写,并不能进行源程序编译调试。与之相对,微软自家的Visual Studio是一个集成开发环境(IDE),下载安装后可以直接进行源程序的编译调试。

一个现代编译器的主要工作流程如下: 源代码 (source code) => 预处理器 (preprocessor) => 编译器 (compiler) => 汇编程序 (assembler) => 目标代码 (object code) => 链接器 (Linker) => 可执行文件 (executables)。VSCode 本身仅仅是一个源代码编辑器。不过,当配合插件和编译器后,VSCode也能够完成绝大部分的源代码编译调试工作。

2. 下载与安装

前往官网(https://code.visualstudio.com)下载安装,支持Windows、Linux和Mac系统。可以下载安装版,也可以选择解压即用的绿色版。区别在于安装板会向系统路径写入配置信息,绿色版所有的依赖信息和配置信息均存放于一个目录中。安装版可以在线下载更新和安装更新,绿色版只能下载新版本的绿色安装包解压后覆盖来更新。

安装完成后,点击左侧的扩展商店,搜索chinese,下载中文简体汉化包(可能需要翻墙)。

汉化

安装完成后重启VSCode,即可发现所有界面均已汉化。

注意:

  • VSCode基于文件夹进行编译和调试,每个项目必须对应一个文件夹作为工作路径(根目录),根目录内包含一个.vscode文件夹存放配置文件(json格式);

  • VSCode默认编码为UTF8,对中文支持并不完美,特别是打开已有的包含中文注释的源代码文件时要特别注意,可能导致中文乱码,且在保存文件时弹出警告。因此,对于包含中文注释的已有文件,一般需要新建一个空白文件,保存为UTF8编码格式,然后重新输入中文注释部分再进行保存。

3. 配置C/C++开发环境

3.1. 部署编译器

扩展商店搜索“C”,安装微软官方出品的C/C++扩展。然后重启VSCode。

汉化

然后配置C/C++编译器。在Windows环境下,VSCode支持MSVC编译器和MinGW-w64编译器,二者选一个即可。

  • MSVC编译器 即为 Visual Studio 使用的 C/C++ 编译器(核心文件为 cl.exe),如果下载安装了VS的某个版本(如VS2022),则该编译器已经自动部署到了计算机中。采用VSCode作为编辑器时,可以只单独安装编译器而无需安装完成的VS IDE。前往 Visual Studio 官网(https://visualstudio.microsoft.com/zh-hans/downloads/) ,往下拉,找到并展开 “Visual Studio 20xx 工具”,选择 “Visual Studio 20xx 生成工具”,下载并按照提示进行安装。仅安装 MSVC 编译器占用的空间远小于完整安装 VS IDE。

MSVC编译器下载

  • MinGW-w64编译器 是 Windows 下广泛使用的GCC编译器,MinGW 的全称是:Minimalist GNU on Windows 。它实际上是将C语言编译器 GCC 移植到了 Windows 平台下,并且包含了 Win32API ,因此可以将源代码编译为可在 Windows 中运行的可执行程序。而且还可以使用一些 Windows 不具备的,Linux平台下的开发工具。一句话来概括:MinGW 就是 GCC 的 Windows 版本 。前往MinGW-w64官方GitHub(https://github.com/niXman/mingw-builds-binaries/releases )选择下载并安装编译器。对于 Windows 环境,下载 MingW-W64-builds 版本,建议选择 x86_64-xx.x.0-release-posix-seh-ucrt-rt_v10-rev2.7z 版本。安装时路径必须为全英文。
  • 线程模型:跨平台程序选择posix,win程序(要使用WinAPI)选择win32
    • [ posix ]:线程使用 pthread 的 Windows 版本。posix 是操作系统统一接口标准,不同操作系统需要提供相同的接口以方便应用移植,降低移植成本,但是只支持 POSIX 线程模型。pthread 是在 Linux 下常用的线程库,使用 posix 接口意味着应用的多线程模型移植更方便,哪怕从 Linux 下拉过来一个应用框架也可以较小代价修改代码。但在某些情况下会引起性能下降,毕竟不是 Windows 原生的线程库,C 标准可能到 C11 以上,并且支持 C11(C 语言编码标准)的特性;
    • [ win32 ]:使用 Windows 原生线程库,性能等方面表现更出色,兼容性更好,没有 C11 那些眼花缭乱的特性,就看你是否熟悉 Windows 相关接口。
  • 异常模型:选择seh
    • [ seh ]:(Structured Exception Handling)是一种在Windows下特有的异常处理机制。SEH实现了一种结构化的异常处理机制,可以在程序运行过程中捕获并处理程序错误和异常。 SEH采用了一种基于表格的编码方式,在程序运行时会根据表格内的信息来处理异常。
    • [ dwarf ]:dwarf(DW2,dwarf-2)是一种跨平台的调试信息标准,主要用于UNIX/Linux平台的调试,可以提供更加详细和准确的调试信息,方便程序调试和分析。DWARF则是采用了一种基于编译器输出的调试信息格式,需要编译器在编译时生成相应的调试信息。
    • [ sjlj ]:【20230517补充】最新版本的 mingw-w64 已经不再支持 sjlj 异常处理,取而代之的是 dwarf2 和 seh 两种处理机制。如果您的程序依赖于 sjlj 异常处理机制,那么您需要考虑升级或修改代码以适应 mingw-w64 的最新版本。如果您仍然想使用 sjlj 异常处理机制,那么您可以考虑使用早期版本的 mingw-w64 或者尝试其他编译器。
  • C运行时:选择ucrt
    • [ucrt]:最新的 MinGW 安装包新引入并采用了 Universal C Runtime (UCRT),比 Microsoft Visual C Runtime (MSVCRT)更新。MSVCRT是逐渐被UCRT取代的,因为UCRT提供了一致的API(应用程序接口)和行为,能够让开发人员使用统一的代码来处理相同的任务,不管是哪个Windows平台甚至是通过不同版本编译器编译。但 UCRT 只支持 Windows 10 及其以上的操作系统。
    • [msvcrt]:MSVCRT(Microsoft Visual C++ Runtime)和UCRT(Universal C Runtime)是Microsoft Windows上的两种C标准库变体。MSVCRT在所有Microsoft Windows版本中都默认可用,但由于向后兼容性问题,它已经过时,不兼容C99并且缺少一些功能。

      3.2. MSVC 生成配置文件

VSCode进行编译连接等操作依赖一系列.json格式的配置文件,这些配置文件都位于工作路径下的.vscode文件夹内。

3.2.1. 语言配置(c_cpp_properties.json)

打开VSCode,打开一个工作文件夹,写一个hello world的.cpp程序。在工作路径的根文件夹中,然后按快捷键ctrl+shift+P,搜索“c/c”,选择 “编辑配置(JSON)” 。VSCode将自动创建.vscode/c_cpp_properties.json配置文件。或者,我们也可以手动创建该配置文件并填充内容。

配置c_cpp_properties

根据个人安装MSVC编译器的位置不同,配置compilerPath路径(即cl.exe的路径)。以下图为例,除compilerPath外,其它配置项保持与图中一致。

配置c_cpp_properties

注意,该路径也需要保存在系统的环境变量 Path 中。否则会导致 cl 命令不可用。

3.2.2. 编译配置(task.json)

再次ctrl+shift+P,搜索 “task”,选择 “配置默认测试任务” → “使用模板创建…” → “Others 运行任意外部命令的示例”。VSCode将会自动创建.vscode/task.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
35
36
37
38
39
40
41
42
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "msvc build",
            "type": "shell",
            "command": "cl.exe",
            "args": [
                "/I'E:\\ProgramFiles\\Microsoft Visual Studio\\2019\\BuildTools\\VC\\Tools\\MSVC\\14.25.28610\\include'",
                "/I'C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.18362.0\\shared'",
                "/I'C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.18362.0\\ucrt'",
                "/I'C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.18362.0\\um'",
                "/I'C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.18362.0\\winrt'",
                "/I'${workspaceFolder}\\AAA\\AAAA\\'",
                "/I'${workspaceFolder}\\BBB\\'",
                "/I'${workspaceFolder}\\'",
                "/nologo",
                "${workspaceFolder}\\CCC\\CCCC\\*.c",
                "${workspaceFolder}\\DDD\\*.c",
                "${workspaceFolder}\\EEE\\*.cpp",
                "${workspaceFolder}\\*.cpp",
                "${workspaceFolder}\\*.c",
                "/Zi",
                "/EHsc",
                "/Fo:${workspaceFolder}\\build\\",
                "/Fe:winFFF.exe",
                "/link",
                "/libpath:'E:\\ProgramFiles\\Microsoft Visual Studio\\2019\\BuildTools\\VC\\Tools\\MSVC\\14.25.28610\\lib\\x64'",
                "/libpath:'C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.18362.0\\ucrt\\x64'",
                "/libpath:'C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.18362.0\\um\\x64'"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "reveal": "always"
            },
            "problemMatcher": "$msCompile"
        }
    ]
}

下面对该文件中的 "args" 进行详细解读:

  • "/I'includepath'" 为程序依赖的头文件存放路径,/I 即include。第一条路径为MSVC编译器的头文件路径,后四条路径为Windows 10包含的头文件路径。具体路径根据个人的系统和编译器而异。这五条路径为必备的包含路径;
  • "/I'${workspaceFolder}\\AAA\\AAAA\\'" 等等为工程项目源代码所依赖的头文件的存放路径,其中${workspaceFolder} 为项目的工作路径根目录,AAA和AAAA为项目自定义的文件夹名,根据个人项目的具体情况设置。后面的BBB、CCC等类似;
  • "/nologo" 表示取消显示版权标志在编译器启动时和在编译期间显示信息性消息;
  • "${workspaceFolder}\\CCC\\CCCC\\*.c", 等等表示项目包含的需要编译的源代码文件(.c,.cpp);
  • "/Zi" 选择为程序创建的调试信息的类型,此处将此信息保存在程序数据库(PDB)中;
  • "/EHsc" 选择异常处理模型,此处为同步异常处理模型;
  • "/Fo:${workspaceFolder}\\build\\", 设置创建的 .object 文件的存放路径,此处为工作路径下的build文件夹;
  • "/Fe:winFFF.exe" 设置生成的可执行文件.exe 的名称,此处为 winFFF.exe
  • "/link" 传输指定的参数给link,此处表示将后面的路径传递给连接器用于连接;
  • "/libpath:'winlibpath'" 为 Window 10 的库文件存放路径,根据Windows环境而异。这三条路径为必备的库文件路径;

以一个最简单的一个hello world程序为例,源代码文件名为hello.cpp,相应的 task.json 文件中的 "args" 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
"args": [
    "/I'D:\\Programs\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.24.28314\\include'",
    "/I'C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.18362.0\\shared'",
    "/I'C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.18362.0\\ucrt'",
    "/I'C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.18362.0\\um'",
    "${workspaceFolder}\\hello.cpp",
    "/Zi",
    "/EHsc",
    "/Fo:${workspaceFolder}\\hello.obj",
    "/Fe:${workspaceFolder}\\hello.exe",
    "/link",
    "/libpath:'D:\\Programs\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.24.28314\\lib\\x64'",
    "/libpath:'C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.18362.0\\ucrt\\x64'",
    "/libpath:'C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.18362.0\\um\\x64'"
],

其中,hello.cpp 也可以采用通配符的形式写为 *.cpp,方便后续扩展。

3.2.3. 调试配置(launch.json)

点击 “调试” 图标菜单,选择 “添加配置” => “C++(Windows)” => “Default Configuration”,VSCode将自动创建 launch.json 文件,同样也可以手动创建该配置文件。

launch.json

用以下内容替换该文件的全部默认内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "MSVC: 运行",
            "type": "cppvsdbg",
            "request": "launch",
            "program": "${workspaceFolder}/winFFF.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true
        }
    ]
}

注意,program 字段中的可执行文件名,必须与前面 tasks.jsonargs 字段的 "/Fe:" 参数完全一致(此处均为 winFFF.exe)。

至此,完成所有配置文件的生成。需要提醒的是,VSCode是基于工作路径进行编译调试的,若需要在其他文件夹(项目)中使用已有的配置时,只需要将当前的 .vscode 子文件夹复制到该项目的工作路径下,然后修改其中相应的参数项(如C/C++文件路径、可执行文件名称等)即可。

3.3. MingW-W64 生成配置文件

3.3.1. 语言配置(c_cpp_properties.json)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${default}",
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "10.0.17763.0",
            "compilerPath": "E:/ProgramFiles/mingw64/bin/g++.exe", // <--modified here
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "windows-gcc-x64" // <--modified here
        }
    ],
    "version": 4
}

3.3.2. 编译配置(task.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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++.exe build", // <-- user defined
            "command": "g++.exe",
            "args": [
                "-fdiagnostics-color=always",
                "-std=c++11",
                "-g",
                "${workspaceFolder}/3rdparty/json/*.c",
                "${workspaceFolder}/3rdparty/sofa/*.c",
                "${workspaceFolder}/src/*.cpp",
                "${workspaceFolder}/src/basic/calc/*.cpp",
                "${workspaceFolder}/src/basic/fcn/*.cpp",
                "${workspaceFolder}/src/class/*.cpp",
                "${workspaceFolder}/src/devices/sensors/*.cpp",
                "${workspaceFolder}/src/devices/computers/*.cpp",
                "${workspaceFolder}/src/devices/actuators/*.cpp",
                "${workspaceFolder}/src/io/*.cpp",
                "-I${workspaceFolder}/3rdparty/json", // <-- include header files here and after using "-Ixxxx"
                "-I${workspaceFolder}/3rdparty/sofa",
                "-I${workspaceFolder}/src",
                "-I${workspaceFolder}/src/basic/calc",
                "-I${workspaceFolder}/src/basic/config",
                "-I${workspaceFolder}/src/basic/fcn",
                "-I${workspaceFolder}/src/basic/struct",
                "-I${workspaceFolder}/src/class",
                "-I${workspaceFolder}/src/devices",
                "-I${workspaceFolder}/src/devices/sensors",
                "-I${workspaceFolder}/src/devices/computers",
                "-I${workspaceFolder}/src/devices/actuators",
                "-I${workspaceFolder}/src/io",
                "-o",
                "${workspaceFolder}/winDSS-gcc.exe",
                "-lws2_32" // <-- link lib here and for windows socket
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": "build",
            "detail": "编译器: g++.exe" // user defined
        }
    ]
}

3.3.3. 调试配置(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
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "GCC:调试运行",
            "type": "cppvsdbg",
            "request": "launch",
            "program": "${workspaceFolder}/winDSS-gcc.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "preLaunchTask": "C/C++: g++.exe build" //在启动调试之前默认先编译,以便生成目标程序
        },
        { // used for python, can be deleted
            "name": "Python: 当前文件",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal"
        }
    ]
}

3.4. 编译调试运行

打开前面编写的 hello.cpp,同时按下快捷键 Ctrl + Shift + B。VSCode会启动生成任务并在终端中显示其生成过程。生成完毕后,按 F5 进行调试运行,可在终端中查看运行结果。

launch.json

至此,我们完成了全部的C/C++开发环境部署。官方同样给出了详细的基于MSVC编译器的开发环境部署方法,见参考文献[1]。

3.5. 快捷键

Ctrl + Shift + N 新建一个 VSCode 窗体

Alt + left/right 回到上/下一个光标停留的位置

Ctrl + Shift + P 调出执行命令的输入面板

Ctrl + , 调出设置面板

Ctrl + K, Ctrl + 0 折叠所有代码块

Ctrl +K, Ctrl + J 展开所有代码块

4. 参考文献

[1] Micsosoft. Configure VS Code for Microsoft C++.

本文由作者按照 CC BY 4.0 进行授权

欢迎使用Jekyll!

VSCode部署Python开发环境