写在前面
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++,完事如下图所示:
就是这样。
三、配置工作区.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
的命令,点它。
【注】如果你的命令行总是不出现预期的行为,可能是以下原因:
遗漏了命令前导符>
;你正处于上一个还未退出的命令的中途,按ESC
退出它,去呼出新的命令行;你的工作区已经有了一个我们想要设置的文档(这一章是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文档,都按照上述内容写好了):
在主工作区下任意路径,新建一个cpp代码文件。我这里的位置是A/a.cpp,并输入简单的算法,比如helloworld。如下图所示:
确保你选中了这份代码,Ctrl
+Shift
+P
呼出命令行,输入run task,它会推荐你几个匹配度较高的命令,请选中全称为Tasks: Run Task
的指令:
点击Tasks: Run Task后,会再次推荐你几条优选的task命令,其中就有我们刚刚设置好的任务label和detail,说明VSCode已经识别到我们的任务书了:
(可以看到,还有一个安装扩展后自带的task:“C/C++: cl.exe 生成活动文件”,它和我们自己写的任务目标类似,所以你也可以使用它,它会在你的tasks.json追加这个任务,你可以事后去查看两个任务的区别)
点击它:C/C++ Executable: build current active file
,就会看到终端已经运行并输出build结果了(TERMINAL视口会自动出现在工作区域右下,如果没有的话请键入Ctrl
+Shift
+ˋ
以建立一个新的终端,并重新执行上述过程)。可以看到它调用cl.exe的方式,显示如下:
/A目录如期有了a.obj和a.exe,显示如下:
最后,你应该尝试在终端里运行一下你的a.exe,输入命令./A/a.exe
,结果如下:
呼~~测试到这里就算是成功啦!
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 生成活动文件”任务,它在你第一次调用这个任务时自动追加),那么调试流程现在应该已经正常启动了;否则还需要一小步,手动选择配置,如下图所示:
但是这一默认功能只能提供单文件的调试,如果需要在整个文件夹(项目)下进行调试,需要创建并配置一下launch.json,很容易(tasks.json写好后,launch就容易的多了):
create a launch.json file
,它会推荐几个模板,我们选中C++ (Windows)
,点击它(或者你手动在.vscode里面创建一个launch.json也可以,反正后面会说如何写)。如下图所示:![在这里插入图片描述](http://zhangshiyu.com/zb_users/upload/2023/04/20230405132327168067220715455.png)
![在这里插入图片描述](http://zhangshiyu.com/zb_users/upload/2023/04/20230405132327168067220796789.png)
{ // 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}", } ]}
大功告成,快去设置断点并调试吧!(上面这份launch.json,与之前的tasks.json是配套的,如果你需要另写,需注意"program"
词条一定要设置为你的task生成的带有调试标记的可执行程序的目录,调试标记最好是msvc的,不要用其他编译平台比如mingw生成的调试程序==)。