windows环境下VSCode配置C++教程(使用msvc编译器)

2023年8月14日10:06:31

写在前面

VSCode是个优秀的、开源的、可扩展的代码编辑器,今天就来介绍一下在windows系统下如何用它来配置C++环境。

须知VSCode只是个编辑器,它自己是不带有编译、构建、调试等工具套件的,所以需要我们额外配置一些东西。

(理论上用宇宙超级无敌IDE:Visual Studio 2022就可以,但是我们技术人诶没办法就是玩它太笨重了,而且不够开源。所以我们今天尝试用VSCode配置)

一、安装并配置msvc

首先我们需要下载Visual Studio Installer(现在大大小小的东西都得通过它下载,不能单独下载组件了)。VS下载网址:Visual Studio 2022 Community

我们以免费的最新的(2022.11.08)社区版为例,安装时,选择“单个组件”选项卡,我们需要以下列表里的组件,请确保他们已被选中或已安装:

组件名称
编译器、生成工具和运行时 MSVC v143 - VS 2022 C++ x64/x86生成工具(最新)
SDK、库和框架 Windows 10 SDK (10.0.20348.0)

注:这两个就够了;选择其他相近或较早版本的组件也可,一定要是MSVC生成工具和Windows SDK。

选择安装位置,安装好后关闭Visual Studio。接下来配置MSVC和windows kits的环境变量,需要添加以下环境变量或路径:

变量名 备注
VS170VCTOOLS D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools 这是我的安装位置,你用你的
WIN10KITS D:\Windows Kits\10 这个位置也是
WINDOWS_SDK_VERSION 10.0.20348.0
Path %VS170VCTOOLS%\MSVC\14.33.31629\bin\Hostx64\x64 我们的编译器cl.exe就在这里面
INCLUDE %VS170VCTOOLS%\MSVC\14.33.31629\include 用英文;隔开多个值
INCLUDE %WIN10KITS%\Include\%WINDOWS_SDK_VERSION%\ucrt
INCLUDE %WIN10KITS%\Include\%WINDOWS_SDK_VERSION%\um
INCLUDE %WIN10KITS%\Include\%WINDOWS_SDK_VERSION%\shared
LIB %VS170VCTOOLS%\MSVC\14.33.31629\lib\x64 用英文;隔开多个值
LIB %WIN10KITS%\Lib\%WINDOWS_SDK_VERSION%\ucrt\x64
LIB %WIN10KITS%\Lib\%WINDOWS_SDK_VERSION%\um\x64

环境配置好后,我们可以简单测试一下:

// helloworld.cpp
#include <iostream>
int main()
{
	std::cout << "Hello, world!" << std::endl;
	return 0;
}

打开cmd定位到它,输入编译构建命令:cl /EHsc helloworld.cpp,运行helloworld.exe,正确的话会正常输出。

二、安装VSCode和C++扩展

VSCode下载地址:Visual Studio Code。打开,搜索并安装扩展C/C++,完事如下图所示:

windows环境下VSCode配置C++教程(使用msvc编译器)
就是这样。

三、配置工作区.vscode

VSCode在每个工作区(项目文件夹)下,都配有一个.vscode隐藏文件夹,里面存放一些脚本文件,指示VSCode对工作区的代码进行操作的模板或模式。

3.1 配置编译器信息:c_cpp_properties.json

以D:\source\vscode_msvc\为例,建立它,并在VSCode里打开这个文件夹,使它成为我们目前的主工作区。输入快捷键Ctrl+Shift+P,呼出命令行,输入C/C++,搜索并寻找一个全称为C/C++: Edit Configurations (UI)的命令,点它(如果你搜索不到,或许是遗漏了命令前导符>)。这时就会自动生成一个.vscode文件夹,里面有一个文件叫c_cpp_properties.json,我们的编译器配置就靠它了。

由于我们是通过UI来改的,而不是直接写json的方式,所以VSCode为我们打开了一个C/C++ Configurations主页。如果之前每一步都按照要求配置好,那么这里会自动生成很多已经为你改好的选项,包括配置模式(win32)、编译器路径(…/bin/Hostx64/x64/cl.exe)、编译器参数(无)、IntelliSense模式(windows-msvc-x64)、包含路径(${workspaceFolder/**})、宏定义(_DEBUG,UNICODE,_UNICODE)、C标准(c17)、C++标准(c++17),以及高级设置里的Windows SDK版本(10.0.20348.0),等等。如果这些没有自动生成,请逐一检查它们的路径并如实填写就好;如与你的意愿不符,比如C++标准只需要11,也可以更改。更改是即时响应的,不需要“保存”。

这些设置或修改最终会反映在.vscode/c_cpp_properties.json描述文件里,打开它,你应该会看到如下已经设置好的内容:

// .vscode/c_cpp_properties.json
{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "10.0.20348.0",
            "compilerPath": "D:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.33.31629/bin/Hostx64/x64/cl.exe",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "windows-msvc-x64"
        }
    ],
    "version": 4
}

3.2 配置构建(生成)任务:tasks.json

不要离开你的D:\source\vscode_msvc主工作区,除了.vscode外它应该是空的,所以如果你已经着急写出了一份代码,并且不太熟悉它将对下面的操作产生什么样的影响时,请先关闭或者不要选中它。

首先,键入Ctrl+Shift+P,呼出命令行,输入build,搜索并寻找一个全称为Tasks: Configure Default Build Task的命令,点它。

【注】如果你的命令行总是不出现预期的行为,可能是以下原因:

  1. 遗漏了命令前导符>
  2. 你正处于上一个还未退出的命令的中途,按ESC退出它,去呼出新的命令行;
  3. 你的工作区已经有了一个我们想要设置的文档(这一章是tasks.json,那么你可以跳过前置的步骤,直接按照后面的章节去设置它);

搜索结果会提示你从模板创建一个tasks.json文档,全称是Create tasks.json file from template,点它;

这时会再次提示你使用什么样的构建套件,并推荐了几个可选项,有MSBuild、maven、.NET Core等。都不选,直接点Other。(如果你已经有了tasks.json,而且其中也有已经编写好的任务,那么这里就会显示它们。)

现在,我们的.vscode文件夹里新添进来一个文档:tasks.json,由于VSCode没有提供UI,所以只能通过手写tasks.json来完成构建指令。我们简介一些它的语法,然后编写一些常用的构建指令,就可以了。如果想编写复杂的task,请参考官方手册。

3.2.1 tasks.json基础语法简介

该文档由json格式描述了一个任务集(A Set of Tasks),包含若干任务,每个任务具有一些字符串形式的或者属性(key, or attributes, or properties),常用的键就是标签(label)、任务类型(type)、调用指令(command)等等,这些键都对应了一个或多个字符串,用花括号{}或中括号[]括起来,并用逗号,分隔。

3.2.2 一条简单的build task

举个栗子,一个简单的build任务可以描述如下(可直接复制覆盖tasks.json):

// .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": "C/C++ Executable: build current active file",
            "type": "shell",
            "command": "cl.exe",
            "args": [
                "/EHsc", "${file}",
                "/Fo:",  "${fileDirname}\\",
                "/Fe:",  "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "problemMatcher": "$msCompile",
            "detail": "Build only the current active file."
        },
    ]
}

它记录的信息可以列成表如下:

备注
“label” “C/C++ Executable: build current active file” 标签值。用于VSCode识别你的任务,相当于给任务起个名。
“type” “shell” 任务类型。你想得到什么样的构建结果,有shell,process等多种选项。默认shell,即控制台程序。
“command” “cl.exe” 你想呼起的指令。这里我们就是msvc的编译器cl.exe
“args” “/EHsc” et al. 为你的指令加上各种参数。/EH是设置异常处理模型,/Fo是输出目录,/Fe是重命名
“problemMatcher” “$msCompile” 优化PROBLEMS视图(强烈推荐,它与msvc绝配,也是我不想用mingw来配置的直接原因)。
“detail” “…balabala” 任务的细节说明,方便日后VSCode用它来提示你。
丰富你的需求,添加更多的键值吧!参考Tasks in Visual Studio Code: custom tasks

这个任务很简单,说白了就是编译你当前选中的单个代码文件,并尝试输出一个可执行程序。假设你选中了工作区下的一个test.cpp,那么当VSCode识别这个task时便会合成一条指令:

cl.exe /EHsc D:\source\vscode_msvc\test.cpp /Fo: D:\source\vscode_msvc /Fe: D:\source\vscode_msvc\test.exe

3.2.3 测试

现在,我们完整的测试一遍(请确保你的工作区的.vscode里面的两份json文档,都按照上述内容写好了):

  1. 在主工作区下任意路径,新建一个cpp代码文件。我这里的位置是A/a.cpp,并输入简单的算法,比如helloworld。如下图所示:
    windows环境下VSCode配置C++教程(使用msvc编译器)

  2. 确保你选中了这份代码,Ctrl+Shift+P呼出命令行,输入run task,它会推荐你几个匹配度较高的命令,请选中全称为Tasks: Run Task的指令:
    windows环境下VSCode配置C++教程(使用msvc编译器)

  3. 点击Tasks: Run Task后,会再次推荐你几条优选的task命令,其中就有我们刚刚设置好的任务label和detail,说明VSCode已经识别到我们的任务书了:
    windows环境下VSCode配置C++教程(使用msvc编译器)
    (可以看到,还有一个安装扩展后自带的task:“C/C++: cl.exe 生成活动文件”,它和我们自己写的任务目标类似,所以你也可以使用它,它会在你的tasks.json追加这个任务,你可以事后去查看两个任务的区别)

  4. 点击它:C/C++ Executable: build current active file,就会看到终端已经运行并输出build结果了(TERMINAL视口会自动出现在工作区域右下,如果没有的话请键入Ctrl+Shift+ˋ以建立一个新的终端,并重新执行上述过程)。可以看到它调用cl.exe的方式,显示如下:
    windows环境下VSCode配置C++教程(使用msvc编译器)

  5. /A目录如期有了a.obj和a.exe,显示如下:
    windows环境下VSCode配置C++教程(使用msvc编译器)

  6. 最后,你应该尝试在终端里运行一下你的a.exe,输入命令./A/a.exe,结果如下:
    windows环境下VSCode配置C++教程(使用msvc编译器)
    呼~~测试到这里就算是成功啦!

3.2.4 推荐几个常用的任务

我这里还写了几个任务,分别对应不同的编码场景,希望能帮到大家!(附tasks.json文档:download custom tasks.json(站内地址放心跳转,如地址失效可评论提醒或索要)

任务标签 应用场景
“C/C++ Executable: build current active file” 只编译并生成当前活跃文件。(适用于每日刷题那种,即不断在工作区内创建多个单文件小项目)
“C/C++ Executable: build and debug current active file” 只编译并生成当前活跃文件,并产生调试信息(.pdb文件等,放在bin目录)。
“C++ Executable: build current folder” 视当前活跃文件所在的文件夹为一个独立的项目,进行编译构建(放在bin目录)。
“C++ Executable: build and debug current folder” 相当于上一个任务的debug版本,构建并产生调试信息(放在bin目录)。
“C++ dynamic link library: build current folder” 为当前活跃文件所在的文件夹(项目)生成一个.dll动态链接库,放在bin目录。
“C++ static library: build current folder” 为当前活跃文件所在的文件夹(项目)生成一个.lib静态库,放在bin目录。(目前只能以你的项目里第一个源文件的名字来命名,原因是lib.exe的重命名等功能选项已被非VS环境禁用)
“C++: clear build” 清除当前活跃文件所在的文件夹(项目)下的所有build,即清空bin目录。

【注】它们仍不能胜任更复杂的项目构建任务。如果需要,要额外引入cmake支持(扩展),或者干脆直接使用Visual Studio。

3.3 配置调试器:launch.json

其实没有launch.json也是可以单文件调试的,因为我们有安装C/C++扩展,它提供了支持。

可以进行一个简单的测试:选中一个活跃的代码文件,设置好断点,然后点击左侧调试界面里的Run and Debug,如果你的tasks.json已经被默认追加了任务(就是扩展自带的“C/C++: cl.exe 生成活动文件”任务,它在你第一次调用这个任务时自动追加),那么调试流程现在应该已经正常启动了;否则还需要一小步,手动选择配置,如下图所示:
windows环境下VSCode配置C++教程(使用msvc编译器)
但是这一默认功能只能提供单文件的调试,如果需要在整个文件夹(项目)下进行调试,需要创建并配置一下launch.json,很容易(tasks.json写好后,launch就容易的多了):

  1. 首先,在工作区内选中一个C++代码文件,比如刚刚的a.cpp,确保你接下来的设置可以被C/C++扩展检测到。不妨多写些功能,以便测试调试。
  2. 在左侧的调试界面,点击create a launch.json file,它会推荐几个模板,我们选中C++ (Windows),点击它(或者你手动在.vscode里面创建一个launch.json也可以,反正后面会说如何写)。如下图所示:
    windows环境下VSCode配置C++教程(使用msvc编译器)
    windows环境下VSCode配置C++教程(使用msvc编译器)
  3. 现在你的.vscode文件夹里有launch.json了,打开它,编辑以下内容。
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "C++ Launch (Windows)",
            "type": "cppvsdbg",
            "request": "launch",
            "program": "${fileDirname}\\bin\\main.exe",
            "cwd": "${fileDirname}",
        }
    ]
}
  1. 大功告成,快去设置断点并调试吧!(上面这份launch.json,与之前的tasks.json是配套的,如果你需要另写,需注意"program"词条一定要设置为你的task生成的带有调试标记的可执行程序的目录,调试标记最好是msvc的,不要用其他编译平台比如mingw生成的调试程序==)。

大功告成,享受你的Visual Studio Code + MSVC之旅吧!

  • 作者:弦乐四重奏
  • 原文链接:https://blog.csdn.net/lzh1097776020/article/details/127734980
    更新时间:2023年8月14日10:06:31 ,共 6998 字。