为 Microsoft C++ 配置 VS Code
在本教程中,您将配置 Visual Studio Code 以在 Windows 上使用 Microsoft Visual C++ 编译器和调试器。
配置 VS Code 后,您将在 VS Code 中编译和调试一个简单的 Hello World 程序。本教程不教授有关 Microsoft C++ 工具集或 C++ 语言的详细信息。对于这些主题,Web 上有许多优秀的资源可用。
如果您有任何问题,请随时在 VS Code 文档存储库中为此教程提交问题。
先决条件
要成功完成本教程,您必须执行以下操作
-
安装 VS Code 的 C/C++ 扩展。您可以通过在扩展视图中搜索“c++”来安装 C/C++ 扩展 (⇧⌘X (Windows, Linux Ctrl+Shift+X))。
-
安装 Microsoft Visual C++ (MSVC) 编译器工具集。
如果您有最新版本的 Visual Studio,请从 Windows “开始”菜单打开 Visual Studio Installer,并验证是否已选中“C++ 工作负载”。如果未安装,请选中该框,然后在安装程序中选择“修改”按钮。
您也可以在不完全安装 Visual Studio IDE 的情况下安装“使用 C++ 的桌面开发”工作负载。从 Visual Studio 下载页面,向下滚动直到在“所有下载”部分下看到“Visual Studio 工具”,然后选择“Visual Studio 2022 的生成工具”的下载。
这将启动 Visual Studio Installer,它将弹出一个对话框,显示可用的 Visual Studio 生成工具工作负载。选中“使用 C++ 的桌面开发”工作负载,然后选择“安装”。
注意:只要您还拥有有效的 Visual Studio 许可证(社区版、专业版或企业版),并且您正在积极使用该许可证来开发 C++ 代码库,您就可以将 Visual Studio Build Tools 中的 C++ 工具集与 Visual Studio Code 一起使用,以编译、构建和验证任何 C++ 代码库。
检查您的 Microsoft Visual C++ 安装
要从命令行或 VS Code 使用 MSVC,您必须从“Developer Command Prompt for Visual Studio”运行。PowerShell、Bash 或 Windows 命令提示符等普通 shell 没有设置必要的路径环境变量。
要打开 Developer Command Prompt for VS,请在 Windows “开始”菜单中开始键入“developer”,您应该会在建议列表中看到它。确切的名称取决于您安装的 Visual Studio 或 Visual Studio Build Tools 的版本。选择该项以打开提示符。
您可以键入“cl”来测试您是否正确安装了 C++ 编译器 cl.exe
,您应该会看到一条包含版本和基本用法描述的版权消息。
如果 Developer Command Prompt 使用 BuildTools 位置作为起始目录(您不希望将项目放在那里),请在开始创建新项目之前导航到您的用户文件夹 (C:\users\{您的用户名}\
)。
注意:如果由于某种原因您无法从“Developer Command Prompt”运行 VS Code,您可以在 在“Developer Command Prompt”之外运行 VS Code 中找到在 VS Code 中构建 C++ 项目的解决方法。
创建 Hello World
从 Developer Command Prompt 中,创建一个名为“projects”的空文件夹,您可以在其中存储所有 VS Code 项目,然后创建一个名为“helloworld”的子文件夹,导航到其中,并在该文件夹 (.
) 中打开 VS Code (code
),方法是输入以下命令
mkdir projects
cd projects
mkdir helloworld
cd helloworld
code .
“code .”命令在当前工作文件夹中打开 VS Code,该文件夹将成为您的“工作区”。当您完成本教程时,您将看到在工作区中的 .vscode
文件夹中创建了三个文件
tasks.json
(构建说明)launch.json
(调试器设置)c_cpp_properties.json
(编译器路径和 IntelliSense 设置)
添加源代码文件
在“文件资源管理器”标题栏中,选择“新建文件”按钮,并将文件命名为 helloworld.cpp
。
添加 hello world 源代码
现在粘贴此源代码
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<string> msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"};
for (const string& word : msg)
{
cout << word << " ";
}
cout << endl;
}
现在按 ⌘S (Windows, Linux Ctrl+S) 保存文件。请注意,您刚刚添加的文件如何出现在 VS Code 侧栏的“文件资源管理器”视图中 (⇧⌘E (Windows, Linux Ctrl+Shift+E))
您还可以通过在主“文件”菜单中选中“自动保存”来启用 自动保存,以自动保存您的文件更改。
左侧的活动栏允许您打开不同的视图,例如“搜索”、“源代码管理”和“运行”。您将在本教程的稍后部分查看“运行”视图。您可以在 VS Code 用户界面文档中找到有关其他视图的更多信息。
注意:当您保存或打开 C++ 文件时,您可能会看到来自 C/C++ 扩展的关于 Insiders 版本可用性的通知,该版本允许您测试新功能和修复。您可以通过选择
X
(“清除通知”)来忽略此通知。
探索 IntelliSense
在新的 helloworld.cpp
文件中,将鼠标悬停在 vector
或 string
上以查看类型信息。在声明 msg
变量后,开始键入 msg.
,就像调用成员函数时一样。您应该立即看到一个完成列表,其中显示所有成员函数,以及一个窗口,其中显示 msg
对象的类型信息
您可以按 Tab 键插入所选成员;然后,当您添加左括号时,您将看到有关函数所需的任何参数的信息。
运行 helloworld.cpp
请记住,C++ 扩展使用您计算机上安装的 C++ 编译器来构建您的程序。在尝试在 VS Code 中运行和调试 helloworld.cpp
之前,请确保您已安装 C++ 编译器。
-
打开
helloworld.cpp
,使其成为活动文件。 -
按编辑器右上角的播放按钮。
-
从系统上检测到的编译器列表中选择“C/C++: cl.exe 生成和调试活动文件”。
您只需在首次运行 helloworld.cpp
时选择编译器。此编译器将设置为 tasks.json
文件中的“默认”编译器。
-
构建成功后,您的程序的输出将显示在集成的“终端”中。
如果您在尝试使用 cl.exe 构建和调试时遇到错误,请确保您已使用 code .
快捷方式从 Developer Command Prompt for Visual Studio 启动了 VS Code。
首次运行程序时,C++ 扩展会创建 tasks.json
,您可以在项目的 .vscode
文件夹中找到它。tasks.json
存储构建配置。
您的新 tasks.json
文件应类似于以下 JSON
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "C/C++: cl.exe build active file",
"command": "cl.exe",
"args": [
"/Zi",
"/EHsc",
"/Fe:",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"${file}"
],
"problemMatcher": ["$msCompile"],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
]
}
注意:您可以在变量参考中了解有关
tasks.json
变量的更多信息。
command
设置指定要运行的程序;在本例中为“cl.exe”。args
数组指定将传递给 cl.exe 的命令行参数。这些参数必须按照编译器预期的顺序指定。
此任务告诉 C++ 编译器获取活动文件 (${file}
),对其进行编译,并在当前目录 (${fileDirname}
) 中创建一个可执行文件(/Fe:
开关),该可执行文件与活动文件同名,但带有 .exe
扩展名 (${fileBasenameNoExtension}.exe
),对于我们的示例,结果为 helloworld.exe
。
label
值是您将在任务列表中看到的内容;您可以随意命名。
detail
值是您将在任务列表中看到的任务描述。强烈建议重命名此值,以将其与类似任务区分开来。
problemMatcher
值选择要用于在编译器输出中查找错误和警告的输出分析器。对于 cl.exe,如果您使用 $msCompile
问题匹配器,您将获得最佳结果。
从现在开始,播放按钮将从 tasks.json
读取,以确定如何构建和运行您的程序。您可以在 tasks.json
中定义多个构建任务,并且播放按钮将使用标记为默认的任务。如果您需要更改默认编译器,可以运行“任务: 配置默认构建任务”。或者,您可以修改 tasks.json
文件并通过替换以下段落来删除默认值
"group": {
"kind": "build",
"isDefault": true
},
替换为
"group": "build",
修改 tasks.json
您可以通过使用类似于 "${workspaceFolder}/*.cpp"
而不是 "${file}"
的参数来修改 tasks.json
以构建多个 C++ 文件。这将构建当前文件夹中的所有 .cpp
文件。您还可以通过将 "${fileDirname}\\${fileBasenameNoExtension}.exe"
替换为硬编码的文件名(例如 "${workspaceFolder}\\myProgram.exe"
)来修改输出文件名。
调试 helloworld.cpp
要调试您的代码,
- 返回到
helloworld.cpp
,使其成为活动文件。 - 通过单击编辑器边距或在当前行上使用 F9 设置断点。
- 从播放按钮旁边的下拉列表中,选择“调试 C/C++ 文件”。
- 从系统上检测到的编译器列表中选择“C/C++: cl.exe 生成和调试活动文件”(您只需在首次运行或调试
helloworld.cpp
时选择编译器)。
播放按钮有两种模式:“运行 C/C++ 文件”和“调试 C/C++ 文件”。它将默认为上次使用的模式。如果您在播放按钮中看到调试图标,您可以选择播放按钮进行调试,而不是选择下拉菜单项。
如果您在尝试使用 cl.exe 构建和调试时遇到错误,请确保您已使用 code .
快捷方式从 Developer Command Prompt for Visual Studio 启动了 VS Code。
探索调试器
在您开始单步执行代码之前,让我们花一点时间注意用户界面的几个变化
-
集成终端出现在源代码编辑器的底部。在“调试输出”选项卡中,您会看到指示调试器正在运行的输出。
-
编辑器突出显示您在启动调试器之前设置断点的行
-
左侧的“运行和调试”视图显示调试信息。您将在本教程的稍后部分看到一个示例。
-
在代码编辑器的顶部,会出现一个调试控制面板。您可以通过抓住左侧的点来在屏幕上移动它。
单步执行代码
现在您可以开始单步执行代码了。
-
单击或按调试控制面板中的“单步跳过”图标。
这将使程序执行前进到 for 循环的第一行,并跳过在创建和初始化
msg
变量时调用的vector
和string
类中的所有内部函数调用。请注意左侧“变量”窗口中的变化。在本例中,错误是预期的,因为尽管循环的变量名现在对调试器可见,但语句尚未执行,因此此时没有任何内容可读取。但是,
msg
的内容是可见的,因为该语句已完成。 -
再次按“单步跳过”以前进到此程序中的下一个语句(跳过所有为初始化循环而执行的内部代码)。现在,“变量”窗口显示有关循环变量的信息。
-
再次按“单步跳过”以执行
cout
语句。(请注意,C++ 扩展在循环退出之前不会将任何输出打印到“调试控制台”。) -
如果您愿意,您可以继续按“单步跳过”,直到向量中的所有单词都已打印到控制台。但是如果您好奇,请尝试按“单步进入”按钮以单步执行 C++ 标准库中的源代码!
要返回到您自己的代码,一种方法是继续按“单步跳过”。另一种方法是在您的代码中设置断点,方法是切换到代码编辑器中的
helloworld.cpp
选项卡,将插入点放在循环内cout
语句的某个位置,然后按 F9。左侧的装订线中会出现一个红点,指示已在此行上设置断点。然后按 F5 以从标准库标头中的当前行开始执行。执行将在
cout
处中断。如果您愿意,可以再次按 F9 以关闭断点。
设置监视
有时您可能想要在程序执行时跟踪变量的值。您可以通过在变量上设置“监视”来执行此操作。
-
将插入点放在循环内。在“监视”窗口中,选择加号,然后在文本框中键入
word
,这是循环变量的名称。现在在单步执行循环时查看“监视”窗口。 -
通过在循环前添加以下语句来添加另一个监视:
int i = 0;
。然后,在循环内,添加以下语句:++i;
。现在像上一步一样为i
添加监视。 -
要快速查看任何变量在执行暂停在断点处时的值,您可以将鼠标指针悬停在其上方。
使用 launch.json 自定义调试
当您使用播放按钮或 F5 进行调试时,C++ 扩展会动态创建调试配置。
在某些情况下,您可能需要自定义调试配置,例如指定在运行时传递给程序的参数。您可以在 launch.json
文件中定义自定义调试配置。
要创建 launch.json
,请从播放按钮下拉菜单中选择“添加调试配置”。
然后,您将看到各种预定义的调试配置的下拉列表。选择“C/C++: cl.exe 生成和调试活动文件”。
VS Code 创建一个 launch.json
文件,该文件看起来像这样
{
"version": "0.2.0",
"configurations": [
{
"name": "C/C++: cl.exe build and debug active file",
"type": "cppvsdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"preLaunchTask": "C/C++: cl.exe build active file"
}
]
}
在上面的 JSON 中,program
指定您要调试的程序。此处它设置为活动文件文件夹 (${fileDirname}
) 和带有 .exe
扩展名的活动文件名 (${fileBasenameNoExtension}.exe
),如果 helloworld.cpp
是活动文件,则将为 helloworld.exe
。args
属性是要在运行时传递给程序的参数数组。
默认情况下,C++ 扩展不会向您的源代码添加任何断点,并且 stopAtEntry
值设置为 false
。
将 stopAtEntry
值更改为 true
,以使调试器在您开始调试时在 main
方法处停止。
从现在开始,播放按钮和 F5 将在启动程序进行调试时从您的
launch.json
文件中读取。
C/C++ 配置
如果您想要更好地控制 C/C++ 扩展,您可以创建一个 c_cpp_properties.json
文件,这将允许您更改编译器路径、包含路径、C++ 标准(默认为 C++17)等设置。
您可以通过从命令面板运行命令“C/C++: 编辑配置(UI)”来查看 C/C++ 配置 UI (⇧⌘P (Windows, Linux Ctrl+Shift+P))。
这将打开“C/C++ 配置”页面。当您在此处进行更改时,VS Code 会将它们写入 .vscode
文件夹中名为 c_cpp_properties.json
的文件。
Visual Studio Code 将这些设置放在 .vscode\c_cpp_properties.json
中。如果您直接打开该文件,它应该看起来像这样
{
"configurations": [
{
"name": "Win32",
"includePath": ["${workspaceFolder}/**"],
"defines": ["_DEBUG", "UNICODE", "_UNICODE"],
"windowsSdkVersion": "10.0.18362.0",
"compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/VC/Tools/MSVC/14.24.28314/bin/Hostx64/x64/cl.exe",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "msvc-x64"
}
],
"version": 4
}
仅当您的程序包含工作区或标准库路径中不存在的头文件时,才需要添加到“包含路径”数组设置中。
编译器路径
compilerPath
设置是配置中的重要设置。扩展使用它来推断 C++ 标准库头文件的路径。当扩展知道在何处查找这些文件时,它可以提供有用的功能,例如智能完成和“转到定义”导航。
C/C++ 扩展尝试根据在您的系统上找到的内容来填充 compilerPath
和默认编译器位置。扩展会在几个常见的编译器位置中查找。
compilerPath
搜索顺序为
- 首先检查 Microsoft Visual C++ 编译器
- 然后在适用于 Linux 的 Windows 子系统 (WSL) 上查找 g++
- 然后是 Mingw-w64 的 g++。
如果您安装了 g++ 或 WSL,您可能需要更改 compilerPath
以匹配您的项目的首选编译器。对于 Microsoft C++,路径应类似于这样,具体取决于您安装的特定版本:“C:/Program Files (x86)/Microsoft Visual Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x64/cl.exe”。
重用 C++ 配置
VS Code 现在配置为使用 Microsoft C++ 编译器。该配置适用于当前工作区。要重用该配置,只需将 JSON 文件复制到新项目文件夹(工作区)中的 .vscode
文件夹,并根据需要更改源文件和可执行文件的名称。
在“Developer Command Prompt”之外运行 VS Code
在某些情况下,无法从“Developer Command Prompt for Visual Studio”运行 VS Code(例如,在通过 SSH 远程开发的场景中)。在这种情况下,您可以使用以下 tasks.json
配置在构建期间自动初始化“Developer Command Prompt for Visual Studio”
{
"version": "2.0.0",
"windows": {
"options": {
"shell": {
"executable": "cmd.exe",
"args": [
"/C",
// The path to VsDevCmd.bat depends on the version of Visual Studio you have installed.
"\"C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/Tools/VsDevCmd.bat\"",
"&&"
]
}
}
},
"tasks": [
{
"type": "shell",
"label": "cl.exe build active file",
"command": "cl.exe",
"args": [
"/Zi",
"/EHsc",
"/Fe:",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"${file}"
],
"problemMatcher": ["$msCompile"],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
注意:
VsDevCmd.bat
的路径可能因 Visual Studio 版本或安装路径而异。您可以通过打开命令提示符并运行dir "\VsDevCmd*" /s
来查找VsDevCmd.bat
的路径。
故障排除
术语“cl.exe”无法识别
如果您看到错误“术语 'cl.exe' 未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。”,这通常意味着您正在“Developer Command Prompt for Visual Studio”之外运行 VS Code,并且 VS Code 不知道 cl.exe
编译器的路径。
VS Code 必须从 Developer Command Prompt for Visual Studio 启动,或者必须将任务配置为在“Developer Command Prompt”之外运行。
您可以始终通过打开新的终端 (⌃⇧` (Windows, Linux Ctrl+Shift+`)) 并键入“cl”来验证 cl.exe
是否可用于 VS Code,从而检查您是否在 Developer Command Prompt 的上下文中运行 VS Code。
致命错误 C1034: assert.h: 未设置包含路径
在这种情况下,cl.exe
可通过 PATH
环境变量用于 VS Code,但 VS Code 仍然需要从“Developer Command Prompt for Visual Studio”启动,或者配置为在“Developer Command Prompt”之外运行。否则,cl.exe
将无法访问重要的环境变量,例如 INCLUDE
。
后续步骤
- 探索 VS Code 用户指南。
- 查看 C++ 扩展概述。
- 创建一个新的工作区,将您的
.vscode
JSON 文件复制到其中,调整新工作区路径、程序名称等的必要设置,然后开始编码!