VSCode是目前比较流行的IDE,因为它插件丰富,依据需求扩展,非常方便。
本文记录搭建windows下基于VSCode的C++编译和调试环境的过程。
网上关于此问题的帖子比较多,找了好几个也没有试验成功,最后发现还是按照VScode的官方文档搭建最靠谱,解释得也更准确。所有下面主要是翻译官方文档。原文链接为Get Started with C++ and Mingw-w64 in Visual Studio Code
在本教程中,您将Visual Studio Code配置为使用mingw-w64中的GCC C++编译器(g++)和GDB调试器来创建在Windows上运行的程序。
配置VS Code后,您将在VS Code中编译和调试一个简单的Hello World程序。本教程不教您GCC、GDB、明w-w64或C++语言。对于这些主题,网络上有许多很好的资源。
如果您有任何问题,请随时在VS Code文档存储库(Issues · microsoft/vscode-docs · GitHub)中提交本教程的问题。
- 准备工作
1、安装VSCode
2、安装C/C++ 扩展插件
在VSCode“扩展”中搜索“ C/C++ extension for VS Code”,如下所示,然后安装
3、安装MinGW
参见我另一篇文章cmake创建windows工程编译环境_qijitao的博客-CSDN博客
- 检查MinGW安装情况
打开cmd,并输入如下命令,如果出现版本信息说明安装正常,否则检查安装路径及PATH环境变量是否匹配。
gcc --version
g++ --version
gdb --version
创建Hello World
先创建HelloWorld工程目录,如下所示,可以根据自己的情况而定,但是同一个工程的所有文件及子文件夹都放在同一个根目录下,本例为helloworld文件夹:
在此根文件夹下创建helloword.cpp文件,如下所示:
#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;
}
然后vscode打开到helloworld文件夹。
在您学习本教程时,您将看到在工作区的.vscode文件夹中创建了三个文件:
tasks.json
(build instructions)launch.json
(debugger settings)c_cpp_properties.json
(compiler path and IntelliSense settings)
- 运行 helloworld.cpp
请记住,C++扩展使用您在计算机上安装的C++编译器来构建程序。在尝试通过VS Code运行和调试helloworld.cpp之前,请确保安装了C++编译器(就是前面安装的MinGW)。
- 打开helloworld.cpp,使其成为活动文件。
- 按编辑器右上角的播放按钮。
- 从系统上检测到的编译器列表中选择C/C++: g++.exe构建和调试活动文件。 只有在第一次运行helloworld.cpp时,您才会被要求选择编译器。此编译器将被设置为tasks.json文件中的“默认”编译器。
- 构建成功后,程序的输出将出现在集成的终端中。
第一次运行程序时,C++扩展会创建tasks.json,您可以在项目的.vscode文件夹中找到它。tasks.json存储构建配置。
您的新tasks.json文件应类似于下面的JSON:
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe 生成活动文件",
"command": "D:\\wecode_build_tools\\mingw\\bin\\g++.exe",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
其中的变量具体含义可以参见Visual Studio Code Variables Reference
command设置指定要运行的程序;在本例中,为g++。args数组指定将传递给g++的命令行参数。这些参数必须按编译器预期的顺序指定。
此任务告诉g++获取活动文件(${file}),编译它,并在当前目录(${fileDirname})中创建一个与活动文件同名但扩展名为.exe的可执行文件(${fileBasenameNoExtend}.exe),例如在我们的示例中是helloworld.exe。
标签(label)值是您将在任务列表中看到的;您可以为其命名任何您喜欢的值。
详细信息(detail)值是您将在任务列表中作为任务描述的值。强烈建议重命名此值,以将其与类似任务区分开来。
从现在开始,播放按钮将从tasks.json中读取,以确定如何构建和运行程序。您可以在tasks.json中定义多个构建任务,无论哪个任务被标记为默认值,播放按钮都将使用。如果您需要更改默认编译器,您可以运行任务:配置默认生成任务(Ctrl+shift+p触发命令行,然后输入Configure default build task,下面会有对应的提示,选择并修改它)。或者,您可以修改tasks.json文件并通过替换此段删除默认值:
"group": {
"kind": "build",
"isDefault": true
},
为:
"group": "build",
- 修改tasks.json
您可以修改tasks.json以生成多个C++文件,方法是使用"${workspaceFolder}/*.cpp"等参数而不是${file}。这将生成当前文件夹中的所有.cpp文件。您还可以通过将“${fileDirname}\${fileBasenameNoExtend}.exe”替换为硬编码的文件名(例如"${workspaceFolder}\\myProgram.exe")来修改输出文件名。
- 调试 helloworld.cpp
- 返回helloworld.cpp,使其成为活动文件。
- 通过单击编辑器边距或在当前行上使用F9设置断点。helloworld.cpp中断点截图
- 从播放按钮旁边的下拉列表中,选择调试C/C++文件。播放按钮下拉列表的屏幕截图,播放按钮下拉列表的屏幕截图:
- 从系统上检测到的编译器列表中选择C/C++: g++构建和调试活动文件(只有在第一次运行/调试helloworld.cpp时,您才会被要求选择编译器)。C++调试配置下拉列表
播放按钮有两种模式:运行C/C++文件和调试C/C++文件。它将默认为上次使用的模式。如果您在播放按钮中看到调试图标,您可以只单击播放按钮进行调试,而不是使用下拉列表
调试到断点的界面:
- 通过launch.json自定义调试信息
当您使用播放按钮或F5进行调试时,C++扩展会动态创建动态调试配置。
在某些情况下,您希望自定义调试配置,例如指定要在运行时传递给程序的参数。您可以在launch.json文件中定义自定义调试配置。
要创建launch.json,请从播放按钮下拉菜单中选择添加调试配置。
或者ctrl+shift+p输入Add debug configuration:
然后,您将看到各种预定义调试配置的下拉列表。选择C/C++: g++.exe构建和调试活动文件。
VS Code创建一个启launch.json文件,该文件看起来如下所示:
{
"configurations": [
{
"name": "C/C++: g++.exe 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "D:\\wecode_build_tools\\mingw\\bin\\gdb.exe",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++.exe 生成活动文件"
}
],
"version": "2.0.0"
}
在上面的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)等。
您可以通过从命令面板(Ctrl+Shift+P)运行命令C/C++:编辑配置(UI)来查看C/C++配置UI。
这将打开C/C++配置页面。在此处进行更改时,VS Code会将它们写入.vscode文件夹中名为c_cpp_properties.json的文件中。
在这里,我们将配置名称更改为win32,将编译器路径下拉列表设置为g++编译器,并将IntelliSense模式设置为与编译器(windows-gcc-x64,依次表示操作系统平台-编译器-处理器架构)匹配。
Visual Studio Code将这些设置放置在.vscode\c_cpp_properties.json中。如果直接打开该文件,它应该如下所示:
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"compilerPath": "D:\\wecode_build_tools\\mingw\\bin\\gcc.exe",
"cStandard": "c17",
"cppStandard": "gnu++14",
"intelliSenseMode": "windows-gcc-x64"
}
],
"version": 4
}
如果程序包含不在工作区或标准库路径中的头文件,则仅需要添加到包含路径数组设置中。
- 编译器路径
扩展使用编译器路径设置来推断C++标准库头文件的路径。当扩展知道在哪里可以找到这些文件时,它可以提供智能完成和转到定义导航等功能。
C/C++扩展尝试根据它在系统上找到的内容,使用默认编译器位置填充编译器路径。扩展在几个常见的编译器位置中查找。
编译器路径搜索顺序为:
1、Microsoft Visual C++编译器的第一次检查
2、然后在Windows子系统for Linux (WSL)上查找g++
3、然后g++代表明w-w64。
如果安装了Visual Studio或WSL,则可能需要更改编译器路径以匹配项目的首选编译器。例如,如果您使用i686体系结构、Win32线程和sjlj异常处理安装选项安装了Mingw-w64版本8.1.0,路径将如下所示:C:\Program Files (x86)\mingw-w64\i686-8.1.0-win32-sjlj-rt_v6-rev0\mingw64\bin\g++.exe。
现在你可以创建一个新的工作区,将.vscode JSON文件复制到其中,调整新工作区路径、程序名称等的必要设置,然后开始编码!