VSCODE-Tutorials-将 GCC 与 MinGW 结合使用
在本教程中,你将使用来自mingw-w64的 GCC C++ 编译器 (g++) 和 GDB 调试器配置 Visual Studio Code 以在Windows上运行创建运行的程序
配置 VS Code 后,您将在 VS Code 中编译和调试一个简单的 Hello World 程序。本教程不会教您 GCC、GDB、Mingw-w64 或 C++ 语言。对于这些主题,Web 上有许多很好的资源可用。
准备工作
这两者的安装与配置参考之前的博客,输入以下命令查看MinGW是否安装成功:
g++ --version
gdb --version
如果您没有看到预期的输出或者g++
或者gdb
没有一个公认的命令,请确保您的路径条目MinGW的-W64二进制位置在编译器位于匹配。
显示以上信息则代表安装成功。
创建Hello World
创建工作区
创建一个名为的空文件夹projects,您可以在其中放置所有 VS Code 项目。然后创建一个名为 helloworld 的子文件夹,右击projects文件夹点击 通过Code打开。在学习本教程时,您将看到.vscode
在工作区的文件夹中创建了三个文件:
tasks.json
(构建说明)launch.json
(调试器设置)c_cpp_properties.json
(编译器路径和 IntelliSense 设置)
点击文件 > 将工作区另存为 > 打开projects文件夹 > 保存,操作完成后就将projects设为了工作区,可以该工作区下创建多个工作项目。
关于直接创建文件夹和创建工作区的差别这里不进行叙述
添加源码
选中helloworld并在文件资源管理器标题栏中,选择新建文件按钮并将文件命名为helloworld.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;
}
按住Ctrl+S保存后,显示如下:
建立helloworld.cpp
接下来,创建一个tasks.json文件来告诉VSCODE(编辑器)如何建立(编译)程序,该文件主要用来调用g++
编译器去创建源码的可执行文件。操作步骤是:终端(Terminal )> 配置默认生成任务(Configure Default Build Task),在下拉列表中显示的是给C++编译器的各类预定义目标(task)。选择C/C++:g++.exe生成活动文件(C/C++:g++.exe build active file),
这将创建一个tasks.json
文件在.vscode
文件夹中并在编辑器中打开它。你的新tasks.json
文件应该类似于下面的 JSON:
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe 生成活动文件",
"command": "C:\\mingw64\\mingw64\\bin\\g++.exe",
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "编译器: C:\\mingw64\\mingw64\\bin\\g++.exe"
}
]
}
其中参数说明如下:
command
:设置指定程序运行(在这里就是指的g++)。
args
:数组形式。设置一些传递给命令行g++
的参数,这些参数必须按一定的顺序提供给编译器。
-g
:提供给g++
进行编译的生成文件(${file}
)
-o
:创造生成文件的可执行文件在当前路径(${fileDirname}
),并且使用相同名字的.exe
扩展(${fileBasenameNoExtension}.exe
),这里就是helloworld.exe。
lable
:在任务中可以看到的值(可自定义命名)
isDefault
:true的设定仅仅是为了方便起见,它是指定您按Ctrl+Shift+B时运行此任务,当为false时,仍可以使用终端(Terminal)> 运行生成任务 (Run Build Task)从终端菜单运行它。
运行生成任务
- 返回
helloworld.cpp
. 你需要运行helloworld.cpp
并且需要运行生成文件. tasks.json
定义了运行生成任务的命令, 按住Ctrl+Shift+B
或者使用终端(Terminal)> 运行生成任务 (Run Build Task)。- 当任务开始后,集成终端面板将会在源代码下方显示,任务完成后,终端将会显示编译器的的输出,说明编译是否成功,成功地
g++
编译如下:
使用+
键创建一个新终端,这是一个以project文件夹为工作目录的新终端,进入helloworld运行dir
可以看到可执行文件helloworld.exe
进一步输入.\helloworld.exe
可以看到 .cpp
文件中要输出的内容。
修改tasks.json
您可以tasks.json
通过使用类似的参数"${workspaceFolder}\\*.cpp"
而不是${file}
. 这将构建.cpp
当前文件夹中的所有文件。您还可以通过替换"${fileDirname}\\${fileBasenameNoExtension}.exe"
为硬编码文件名(例如"${workspaceFolder}\\myProgram.exe"
)来修改输出文件名。
调试helloworld.cpp
接下来按下F5
来配置VSCODE编辑器加载GDB
调试器来创建launch.json
文件,以此来调试源码。
1.从主目录下选择运行(Run)> 添加配置(Add Configuration)并进一步选择C++ (GDB/LLDB)。
2.你将会从下拉选项中看到调试配置,选择g++.exe - 生成和调试活动文件(g++.exe build and debug active file.)
VSCODE创建一个launch.sjon
文件,在编辑器中打开它
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "g++.exe - 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "C:\\mingw64\\mingw64\\bin\\gdb.exe",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++.exe 生成活动文件"
}
]
}
其中参数说明如下:
program
:指定需要调试的程序,
${fileDirname}
是表示活动(调试)文件夹
${fileBasenameNoExtension}.exe
:是表示活动(调试)文件名
举例说明则是如果活动(调试)文件是helloworld.cpp,那么${fileBasenameNoExtension}.exe
则表示helloworld.exe。
stopAtEntry
:false表示默认不对main()设置断点,true表示默认对main()设置断点。当为true时,运行(run) > 启动调试表现如下:
若为false则不会出现该情况,直接运行完毕。
preLaunchTask
:在启动前需要执行的任务(也就是tasks.json),因此这里的名字需要与tasks.json中label
参数值保持一致。
C/C++配置
设置 c_cpp_properties.json 可以控制更多的C/C++ extension,这个json文件主要用来改变设置:编译器路径(path to the compiler)、包含路径(include paths)以及C标准(C++ standard;默认是C++17)等。这里有两种设置方式,将分别介绍。
第一种方式(C/C++ configuration UI)
按住Ctrl+Shift+P后,在下拉选项中输入:C/C++;可以选择C/C++:编辑配置(UI)(C/C++: Edit Configurations (UI))调出Microsoft C/C++扩展进行设置。
当你对其中的参数设置改变时,VSCODE将会将这些改变写入c_cpp_properties.json文件,这里我们改变配置名称(Configuration name)为GCC;下拉编译路径(Compiler path )为g++编译器。IntelliSense模式(IntelliSense mode)为Windows-gcc-x64
全部设置完成后点击设置中c_cpp_propertiese.json文件,则会在.vscode文件夹下保存该文件。打开该文件显示如下内容:
{
"configurations": [
{
"name": "GCC",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.17763.0",
"compilerPath": "C:/mingw64/mingw64/bin/g++.exe",
"intelliSenseMode": "windows-gcc-x64",
"cppStandard": "c++17"
}
],
"version": 4
}
同时也可以添加工作空间之外的头文件到includePath路径下,如opencv等。
第二种方式(C/C++ configuration JSON)
按住Ctrl+Shift+P后,在下拉选项中输入:C/C++可以选择C/C++:编辑配置(JSON)(C/C++: Edit Configurations (JSON))直接在.vscode文件夹下创建c_cpp_properties.json。
这种方式则需要对其中的配置参数进行更改,将name
,compilerPath
,intelliSenseMode
进行更改,以及自行决定是否添加cppStandard
参数值:
{
"configurations": [
{
"name": "GCC",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.17763.0",
"compilerPath": "C:/mingw64/mingw64/bin/g++.exe",
"intelliSenseMode": "windows-gcc-x64",
"cppStandard": "c++17"
}
],
"version": 4
}