VS Code:Windows下编写运行C/C++程序(GCC)
VS Code:Windows下编写运行C/C++程序(GCC)
1. 安装Visual Studio Code
下载地址:https://code.visualstudio.com/Download
PS:"System Installer":对当前系统,好像方便获取系统权限;"User Installer":对当前用户,不好装就用"System Installer"吧。
2. 在VS Code中安装 C/C++扩展(快捷键:Ctrl+Shift+X)
3. 安装Mingw-w64
下载地址:https://sourceforge.net/projects/mingw-w64/files/
-
方法一:直接下载在线安装器(国内网络不推荐)
- 运行安装包。
- Architecture选择x86_64,然后Next。
- 使用默认安装文件夹继续Next,安装MinGW。
-
方法二:下载最新版本的
x86_64-posix-seh
1. 解压下载的压缩包到自己想要安装的路径下就算安装完成。
4. 配置环境变量
- 复制“mingw64\bin”所在的路径。
- 右键此电脑->属性->高级系统设置->高级->环境变量。
- 在系统变量中找到
Path
,双击或选中点击编辑
,在编辑环境变量
窗口选择新建
,输入bin
文件夹所在路径(本机解压后bin
文件夹所在的路径:C:\Program Files\mingw64\bin
)。 - 点击
确定
保存修改。
5. 验证
命令提示符中运行以下命令查看是否有预期输出,以验证MINGW是否正确安装:
g++ --version gdb --version
6. 创建Hello World
通过命令提示符,创建project
空文件夹用于存放VS Code项目。然后打开该文件夹,在其下创建helloword
子文件夹,导航到这个子文件夹,并输入code .
在该文件夹下打开VS Code。命令如下:
mkdir projects cd projects mkdir helloworld cd helloworld code .
code .
命令在当前文件夹下打开了VS Code,该文件夹成为了你的“工作空间”。通读教程后,你将看见工作空间的.vscode
文件夹下创建了三个文件:
task.json
(搭建说明)launch.json
(调试器设置)c_cpp_properties.json
(编译器路径和智能提示设置)
7.1. 添加源代码文件
在"文件资源管理器"标题栏中,选择"New File"按钮并命名文件为helloworld.cpp
。
7.2. 添加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; }
Ctrl+S
进行保存。注意刚刚添加的文件是怎样出现在VS Code侧边栏的File Explorer视图(Ctrl+Shift+E
)中的:
你也可以启用Auto Save
来自动保存文件的改变,通过选中File
下的Auto Save
。
最左边的活动栏用于打开不同的视图,比如Search,Source Control, 和Run。本教程后面的部分你会看到Run视图。你可以在VS Code用户界面文档中找到更多关于其他视图的信息。
便笺:当你保存或添加一个C++文件,你可以看见一个来自C/C++扩展关于内部版本可用性的通知,你可以用来测试新的特性和修正。
8. 探索智能提示
在你新的helloworld.cpp
文件中,鼠标悬停在vector
或者string
可以查看类型信息。在声明msg
变量后,像调用成员函数一样开始键入msg.
。你可以立刻看到一个显示所有成员函数的补全列表,和一个显示msg
对象类型信息的窗口:
你可以按Tab
键来插入已选择的成员;然后,当你添加左括号时,你会看见关于这个函数所需的所有参数的信息。
9. 构建helloworld.cpp
接下来,你需要创建一个task.json
文件告诉VS Code怎样构建(编译)程序。这个任务将通过g++编译器创建一个基于源代码的可执行文件。
从主菜单栏选择Terminal > Configure Default Build Task。下拉列表将会展示C++编译器的各种预定义的构建活动下拉清单。选择g++.exe build active file将生成当前在编辑器中显示(活动)的文件。
这会在.vscode
文件夹下创建一个task.json
文件并在编辑器中打开。
你的新task.json
文件应该类似于下面的JSON:
{ "version": "2.0.0", "tasks": [ { "type": "shell", "label": "C/C++: g++.exe build active file", "command": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin\\g++.exe", "args": ["-g", "${file}", "-o", "${fileDirname}\\${fileBasenameNoExtension}.exe"], "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": ["$gcc"], "group": { "kind": "build", "isDefault": true } } ] }
command
设置指定了要运行的程序;本例是g++。args
数组指定要传给 g++ 的命令行参数。这些参数必需按照编译器预期的顺序指定。这个任务告诉g++获取活动文件(${file}
),编译它,并在当前目录创建一个名字和活动文件一样但扩展名是.exe
(${fileBasenameNoExtension}.exe
)的可执行文件(${fileDirname}),我们的示例结果是helloworld.exe
。
便笺:关于
task.json
变量,你可以在变量引用中了解更多。
label
的值是你将在任务列表中看到的值;你可以命名成任何你喜欢的名字。
group
对象中"isDefault": true
的值规定了当你按下Ctrl+Shift+B
时这个任务将会被运行。这个属性只是为了方便,如果你设置为false,你依然可以在Terminal
菜单中用Run Build Task
运行它。
10. 运行构建
- 回到
helloworld.cpp
。你的任务构建了活动文件并且你要构建helloworld.cpp
. - 运行
task.json
中定义的构建任务,按Ctrl+Shift+B
或者从Terminal主菜单选择Run Build Task - 当任务开始时,你需要查看源代码编辑器下方的集成终端面板(TERMINAL)。任务完成后,终端显示编译器用来表示是否构建成功的输出。对于成功的g++构建,输出如下:
- 用
+
按钮创建一个新的终端,你将会获得一个以helloworld
文件夹为工作目录的新终端。运行dir
你会看到可执行的helloworld.exe
。
- 你可以键入
helloworld.exe
(或者.\helloworld.exe
如果你使用PowerShell终端)在终端运行helloworld
。
修改tasks.json
你可以使用参数像"${workspaceFolder}\\*.cpp"
而不是${file}
来修改你的tasks.json
以构建多个C++文件。这将在你当前的文件夹构建所有的.cpp
文件。你也可以通过用一个硬编码文件名(例如"${workspaceFolder}\\myProgram.exe"
)来替换"${fileDirname}\\${fileBasenameNoExtension}.exe"
以修改输出文件名
11. 调试 helloworld.cpp
接下来,你将创建一个launch.json
文件来配置VS Code以在你按F5
调试程序的时候启动 GDB 调试器。
1. 在主菜单选择Run>Add Configuration...然后选择C++(GDB/LLDB)。
2. 然后你会看到一个多种预定义调试配置的下拉列表。选择g++.exe build and debug active file。
VS Code创建 launch.json
文件,在编辑器中打开它,并构建运行“helloworld”。
{ "version": "0.2.0", "configurations": [ { "name": "g++.exe - Build and debug active file", "type": "cppdbg", "request": "launch", "program": "${fileDirname}\\${fileBasenameNoExtension}.exe", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", "miDebuggerPath": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin\\gdb.exe", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "C/C++: g++.exe build active file" } ] }
program
指定想要调试的程序。这里设置为活动文件文件夹${fileDirname}
和扩展名为.exe
的活动文件名${fileBasenameNoExtension.exe}
,如果helloworld.cpp
是活动文件将会生成helloworld.exe
。
默认下,C++扩展不会在你的源代码添加任何断点,并且stopAtEntry
的被值设置为false
。
改变stopAtEntry
的值为true
以在你启动调试器时让调试器停止在main
方法上。
便笺:
preLaunchTask
用于指定在启动之前要被执行的任务。确保它和task.json
文件的label
设置一致。
启动一个调试会话
- 回到
helloworld.cpp
使其成为活动文件。 - 按
F5
或从主菜单选择Run > Start Debugging。在开始单步执行源代码之前,让我们花点时间注意一下用户界面的几个变化:
- 集成终端显示在源代码编辑器的底部。在Debug Output选项卡中,可以看到指示调试器已启动并正在运行的输出。
- 编辑器突出显示
main
方法中的第一条语句。这是C++扩展自动为您设置的断点:
- 左侧的运行视图显示调试信息。您将在后面的教程中看到一个示例。
- 在代码编辑器的顶部,将显示调试控制面板。你可以通过抓取左边的点在屏幕上移动它。
12. 单步执行代码
现在您可以开始单步执行代码了。
-
单击或按调试控制面板中的Step over图标。
这将推进程序执行到for循环的第一行,并在msg
变量被创建和初始化时跳过所有涉及到的,在vector
和string
类中的内部函数的调用。注意左侧Variables窗口的改变。
在本例中,错误时预期的,尽管循环变量名对调试器现在是可见的,语句尚未执行,所以此时没有可读取的。然而,msg
的内容是可见的,因为该语句已经完成。 -
再次按下Step over前进到这个程序的下一个语句(跳过所有用于初始化循环而被执行的内部代码)。现在,Variables窗口显示有关循环变量的信息。
-
再次按下Step over来执行
count
语句。(注意截至2019年三月发行的版本,C++扩展不在Debug Consle
打印任何输出直到退出循环。) -
如果你愿意,可以一直按Step over,直到vector中所有单词都被打印到控制台。但是如果你好奇,试着按下Step Into按钮在C++标准库里来单步执行源代码。
要返回你自己的代码,一种方式是继续按Step over。另一种方式是通过在编辑器中切换到hellworld.cpp
标签在你的代码设置一个断点,将插入点放在循环内count
语句上的某个位置,并按F9
。左侧空白处会出现一个红色的点表示这行设置了一个断点。
然后按F5
来从标准库标题的当前行开始执行。执行将在cout
处中断。如果你愿意,你可以再按F9
关闭断点。
当循环完成时,你可以在集成终端看见输出,以及一些其他由GDB输出的诊断信息。
13. 设置监视
有时你可能想在程序执行的时候追踪变量的值。你可以通过在变量上设置监视来做到这一点。
- 在循环内放置插入点。在
Watch
窗口,点击加号并在文本框中键入word
,这是循环变量的名称。现在在单步执行循环时查看监视窗口。
- 通过在循环前添加这个语句添加另一个监视:
int i = 0;
。然后,在循环内,添加这个语句:++i;
。现在像你上一步做的那样为i
添加监视。 - 快速观察当执行通过断点时变量的值。你可以用鼠标指针悬停在它上面。
14. C/C++配置
如果你想要对C/C++扩展有更好的控制,你可以创建一个c_cpp_properties.json
文件,允许你改变设置,例如编译器的路线,包括路径、C++标准(默认是C++17)等。
你可以从Command Palette (Ctrl+Shift+P)
通过运行命令C/C++: Edit Configurations (UI)查看C/C++配置UI。
这打开了C/C++ Configurations页面。当你对这里进行变更时,VS Code将它们写入一个在.vscode
文件夹中,名为c_cpp_properties.json
的文件。
这里,我们将Configuration name改为GCC,设置Compiler path下拉列表到g++编译器,IntelliSense mode与编译器(gcc-x64)匹配。
Visual Studio Code 将这些设置放在.vscode\c_cpp_properties.json
。如果你直接打开这个文件,它大致如下:
{ "configurations": [ { "name": "GCC", "includePath": ["${workspaceFolder}/**"], "defines": ["_DEBUG", "UNICODE", "_UNICODE"], "windowsSdkVersion": "10.0.18362.0", "compilerPath": "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/bin/g++.exe", "cStandard": "c11", "intelliSenseMode": "gcc-x64" } ], "version": 4 }
你只需要添加到Include path数组设置如果你的程序包括不在你的工作空间或在标准库路径的头文件。
15. 编译器路径
扩展使用compilerPath
设置来推断C++标准库头文件的路径。当扩展直到在哪里可以找到这些文件时,它会提供诸如智能补全和Go to Definition导航。
C/C++扩展尝试用基于它在系统中找到的默认编译器位置来填充compilerPath
。该扩展在几个常见的编译器位置查找。
compilerPath
搜索顺序为:
- 首先检查Microsoft Visual C++编译器
- 然后在Windows子系统 for Linux(WSL)上查找g++
- 然后是Mingw-w64的g++。
如果你安装了Visual Studio或者WSL,你或许需要变更compilerPath
来为你的项目匹配首选编译器。例如,如果你安装了使用i686架构的Mingw-w64 8.1.0 版本,Win32线程,sjlj异常处理安装选项,路径应该是这样的C:\Program Files (x86)\mingw-w64\i686-8.1.0-win32-sjlj-rt_v6-rev0
。
下一步
- 浏览VS Code User Guide
- 回顾Overview of the C++ extension.
- 创建一个新的工作空间,复制你的
.vscode
JSON文件到这,调整新工作空间路径的必要设置,项目名称,等等,并开始编码!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库