使用Microsoft C++编译器配置VSCode
在本教程中,您将在
Windows 上使用
Microsoft Visual c++ 编译器和调试器配置
Visual Studio Code 。
(一)预备知识
要成功完成本教程,您必须完成以下步骤:
-
1.安装Visual Studio Code。 -
2.安装VS Code的C/ c++扩展。你可以通过在Extensions视图中搜索’c++’ (Ctrl+Shift+X) 来安装C/ c++扩展。 -
3.安装Microsoft Visual c++ (MSVC)编译器工具集。 如果您有一个最新版本的Visual Studio,请从Windows开始菜单中打开Visual Studio Installer ,并查看是否检查了c++工作负载。如果没有安装,则选中该框并选择安装程序中的Modify 按钮。 您也可以安装带有c++工作负载的桌面开发,而不需要安装完整的Visual Studio IDE。从Visual Studio下载页面向下滚动,直到在All Downloads 下看到Tools for Visual Studio 2019 ,并选择Build Tools for Visual Studio 2019 下载。 这将启动Visual Studio安装程序,它将弹出一个对话框,显示可用的Visual Studio构建工具工作负载。检查Desktop development with C++ 负载并选择Install 。 注意:您可以使用Visual Studio Build Tools 的c++工具集和Visual Studio Code编译、构建和验证任何c++代码库。
(二)检查您的Microsoft Visual c++安装
要从命令行或VS Code 中使用MSVC ,你必须在Developer Command Prompt for Visual Studio 中运行。普通shell(如PowerShell、Bash或Windows命令提示符) 没有设置必要的路径环境变量。
要打开Developer Command Prompt for VS ,在Windows开始菜单中输入“Developer”,你应该会看到它出现在建议列表中。确切的名称取决于您安装的Visual Studio或Visual Studio构建工具的版本。选择要打开提示符的项目。 你可以通过输入'cl' 来测试你是否已经正确安装了c++编译器cl.exe ,你应该会看到带有版本和基本用法描述的版权信息。 如果开发人员命令提示符使用BuildTools位置作为开始目录(你不会想把项目放在那里),在你开始创建新项目之前,导航到你的用户文件夹(C:\users\{你的用户名}\ )。
(三)创建Hello World
在Developer Command Prompt 中,创建一个名为“projects” 的空文件夹,在这里你可以存储所有的VS Code项目,然后创建一个名为“helloworld” 的子文件夹,导航到它,通过输入以下命令在该文件夹(.) 中打开VS Code (Code) :
mkdir projects
cd projects
mkdir helloworld
cd helloworld
code .
"code ." 命令在当前工作文件夹中打开VS code,这将成为你的"workspace" 。在学习本教程的过程中,你会看到在工作区的.vscode 文件夹中创建了三个文件:
tasks.json (构建指令)launch.json (调试器设置)c_cpp_properties.json (编译器路径和智能感知设置)
3.1添加一个源代码文件
在“文件资源管理器” 标题栏中,选择“新建文件” 按钮,并将文件命名为helloworld.cpp 。
3.2添加helloworld 源代码
现在粘贴源代码:
#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;
}
现在按Ctrl+S 保存文件。注意你刚刚添加的文件是如何出现在VS Code的侧边栏的文件资源管理器视图中(Ctrl+Shift+E ): 您也可以启用“Auto Save”来自动保存您的文件更改,通过检查File 菜单中的“Auto Save”。 最左边的活动栏允许您打开不同的视图,如Search、Source Control和Run 。在本教程的后面,您将看到Run 视图。你可以在VS Code用户界面文档中找到更多关于其他视图的信息。 注意: 当你保存或打开一个C++文件时,你可能会看到来自C/C++扩展的通知,关于内部版本的可用性,它允许你测试新特性和修复。您可以通过选择X (清除通知)来忽略此通知。
3.3探索智能感知
在新的helloworld.cpp 文件中,将鼠标悬停在vector或string上以查看类型信息。在声明了msg变量之后,开始键入msg。就像调用成员函数一样。你应该立即看到一个显示所有成员函数的完成列表,以及一个显示msg对象类型信息的窗口: 按Tab 键可插入所选成员;然后,当您添加开括号时,您将看到关于函数所需的任何参数的信息。
3.4构建helloworld.cpp
接下来,您将创建一个tasks.json 文件告诉VS Code如何构建(编译)程序。这个任务将调用Microsoft c++编译器来基于源代码创建一个可执行文件。
从主菜单中选择Terminal > Configure Default Build Task 。在下拉菜单中,它将显示一个任务下拉菜单,列出c++编译器的各种预定义构建任务。选择cl.exe build active file ,它将构建当前在编辑器中显示(活动)的文件。
这将在.vscode 目录下创建一个tasks.json 文件,并在编辑器中打开它。 你的新tasks.json 文件看起来应该类似于下面的json(已经安装中文扩展模块):
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: cl.exe 生成活动文件",
"command": "cl.exe",
"args": [
"/Zi",
"/EHsc",
"/nologo",
"/Fe:",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"${file}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$msCompile"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "编译器: cl.exe"
}
]
}
command 设置指定要运行的程序;在本例中是"cl.exe" 。args 数组指定将被传递给cl.exe 的命令行参数。这些参数必须按照编译器所期望的顺序指定。这个任务告诉c++编译器把活跃的文件(${file} ),编译它,并在当前目录(${fileDirname} )创建一个与有源文件名称相同的. exe 可执行文件(${fileBasenameNoExtension}.exe) ,对于我们的示例是helloworld.exe 。 注意:您可以了解更多关于tasks.json 的信息。
label 是你将在任务列表中看到的;你想叫什么就叫什么。 problemMatcher 值选择用于查找编译器输出中的错误和警告。对于cl.exe ,如果使用$msCompile 问题匹配器,您将得到最好的结果。 group 对象中的isDefault: true 值指定当按Ctrl+Shift+B 时将运行此任务。这个属性只是为了方便;如果您将其设置为false ,您仍然可以使用Tasks: Run Build Task 从终端菜单中运行它。
3.5运行构建
- 1.回到
helloworld.cpp 。您的任务将构建活动文件,而您希望构建helloworld.cpp - 2.运行
tasks.json 中定义的构建任务,按Ctrl+Shift+B 或从终端主菜单选择Tasks: Run Build Task 构建任务。 - 3.当任务开始时,您应该看到终端出现在源代码编辑器下面。任务完成后,终端显示编译器的输出,表明构建成功还是失败。对于一个成功的c++构建,输出看起来像这样:
如果构建失败是因为没有找到cl.exe ,或者缺少包含路径,确保你已经从Developer Command Prompt for Visual Studio 中启动了VS Code。 - 1.使用
+ 按钮创建一个新终端,您将拥有一个以helloworld 文件夹作为工作目录的新终端(运行PowerShell)。运行ls ,您现在应该看到可执行文件helloworld.exe 以及各种中间c++输出和调试文件(helloworld.obj helloworld.pdb )。 - 你可以通过在终端中输入
.\helloworld.exe 运行helloworld 。
3.6修改tasks.json
您可以通过使用像${workspaceFolder}\\*.cpp 这样的参数而不是${file} 来构建多个c++文件。这将构建当前文件夹中的所有.cpp 文件。你也可以通过将${fileDirname}\\${fileBasenameNoExtension}.exe 替换为硬编码的文件名(例如${workspaceFolder}\\myProgram.exe )来修改输出文件名。
${workspaceFolder} 表示工作目录也就是code . 的目录,而${fileDirname} 表示打开的文件所在的目录。
(四)调试helloworld.cpp
接下来,当你按下F5 来调试程序时,VS Code将创建一个launch.json 文件来启动Microsoft c++调试器。在主菜单中,选择Run > Add Configuration... 然后选择c++ (Windows) 。
然后,您将看到一个用于各种预定义调试配置的下拉列表。选择cl.exe build and debug active file 。
VS Code创建一个launch.json 文件,在编辑器中打开它,构建并运行helloworld 。 VS Code创建一个launch.json 文件,在编辑器中打开它,并构建并运行helloworld 。
{
// 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": "cl.exe - 生成和调试活动文件",
"type": "cppvsdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"console": "externalTerminal",
"preLaunchTask": "C/C++: cl.exe 生成活动文件"
}
]
}
program 设置指定要调试的程序。在这里,它被设置为活动文件文件夹${fileDirname} 和带有.exe 扩展名的活动文件名${fileBasenameNoExtension}.exe ,如果helloworld.cpp 是活动文件,exe 文件将是helloworld.exe 。
默认情况下,c++扩展不会在源代码中添加任何断点,并且stopAtEntry 值设置为false 。将stopAtEntry 值更改为true ,以使调试器在开始调试时在main 上停止。
4.1启动调试会话
- 1.回到
helloworld.cpp ,使它成为活动文件。 - 2.按
F5 或从主菜单中选择Run > Start Debugging 。在您开始逐步执行源代码之前,让我们花点时间来注意一下用户界面中的几个变化:
- 集成终端出现在源代码编辑器的底部。在
Debug Output 选项卡中,可以看到指示调试器已启动并正在运行的输出。 - 编辑器突出显示
main 方法中的第一条语句。这是一个断点,c++扩展自动为您设置: 左边的Run 视图显示调试信息。在本教程的后面,您将看到一个示例。 在代码编辑器的顶部,会出现一个调试控制面板。你可以通过抓取左边的点在屏幕上移动它。
4.2逐步执行代码
现在,您可以开始逐步执行代码了。
- 1.在调试控制面板中选择
Step over 图标,直到for (const string& word: msg) 语句突出显示。 Step Over 命令跳过在创建和初始化msg变量时调用的vector和string 类中的所有内部函数调用。注意左边的Variables 窗口中的变化。在这种情况下,错误是预期的,因为尽管循环的变量名现在对调试器可见,但语句还没有执行,所以此时没有可读的内容。但是msg 的内容是可见的,因为语句已经完成。 - 2.再次按下
Step Over 进入程序中的下一条语句(跳过为初始化循环而执行的所有内部代码)。现在,Variables 窗口显示了关于循环变量的信息。 - 3.再次按
Step over 来执行cout 语句。截至2019年3月版本的扩展,没有输出显示,直到循环完成。 - 4.如果愿意,可以继续按
Step over ,直到vector 中的所有单词都被打印到控制台。但是,如果您对此感到好奇,可以尝试按下Step Into 按钮来逐步查看c++标准库中的源代码! 要返回到您自己的代码,一种方法是一直按Step over 。另一种方法是在代码中设置断点,方法是切换到代码编辑器中的helloworld.cpp 选项卡,将插入点放在循环中cout 语句的某个位置,然后按F9 。左边的凹槽中出现一个红点,表示在该行上设置了断点。 然后按F5 从标准库头文件的当前行开始执行。执行将中断在cout 。如果您愿意,可以再次按F9 来切换断点。
(五)设置watch
有时,您可能希望在程序执行时跟踪变量的值。您可以通过在变量上设置一个watch 来做到这一点。
- 1.将插入点放在循环中。在
watch 窗口中,选择加号,并在文本框中输入word ,这是循环变量的名称。现在,当您步进循环时,查看Watch 窗口。 - 2.通过在循环之前添加下面的语句
int i = 0; 来添加另一个watch ,然后,在循环内部添加如下语句++i; 。现在为i 添加一个watch ,就像你在前面的步骤中做的那样。 - 3.要在断点上暂停执行时快速查看任何变量的值,可以使用鼠标指针将鼠标悬停在该断点上。
(六) C/C++配置
如果您想要更多地控制 C/C++扩展,可以创建c_cpp_properties.json 文件,它将允许你改变设置,如编译器的路径,包括路径,c++标准(默认是c++ 17),以及更多。
您可以通过命令面板(Ctrl+Shift+P )运行命令C/C++: Edit Configurations (UI) 来查看C/C++配置UI。 这将打开C/C++ Configurations 页面。当您在这里进行更改时,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.17763.0",
"compilerPath": "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\Hostx64\\x64\\cl.exe",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "windows-msvc-x64"
}
],
"version": 4
}
如果程序包含不在工作空间或标准库路径中的头文件,则只需要添加到includePath 数组设置中。
6.1编译器路径
compilerPath 设置是配置中的一个重要设置。扩展使用它来推断c++标准库头文件的路径。当扩展知道在哪里找到这些文件,它可以提供有用的功能,如智能补全和Go to Definition 导航。
C/C++扩展尝试根据它在系统上找到的编译器位置来填充compilerPath 。该扩展查找几个常见的编译器位置。 compilerPath 的搜索顺序是:
- 首先检查Microsoft Visual c++ compiler
- 然后在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
在某些情况下,在Visual Studio的Developer Command Prompt 中运行VS Code是不可能的(例如,在通过SSH的远程开发场景中)。在这种情况下,您可以使用以下tasks.json 配置在构建期间自动初始化Visual Studio的Developer Command Prompt 。
{
"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 的路径。
(九)疑难解答
9.1无法识别术语“cl.exe”
如果你看到错误”The term ‘cl.exe’ is not recognized as the name of a cmdlet, function, script file, or operable program”,这通常意味着您正在运行Developer Command Prompt for Visual Studio 以外的Visual Studio和VSCode不知道cl.exe 编译器的路径。
VS Code必须从Visual Studio的Developer Command Prompt for Visual Studio 启动,或者任务必须配置为在开发人员命令提示符之外运行。
你总是可以通过创建一个新终端Ctrl+Shift+``通过输入cl命令来检查你是否从Visual Studio的Developer Command Prompt for Visual Studio 启动。
9.2 fatal error C1034: assert.h: no include path set
在这种情况下,cll .exe 可以通过PATH 环境变量被VS Code 使用,但是VS Code 仍然需要从Visual Studio的Developer Command Prompt 启动,或者配置为在Developer Command Prompt之外运行。否则,cl.exe 无法访问重要的环境变量,如INCLUDE 。
参考目录
https://code.visualstudio.com/docs/cpp/config-msvc
|