相信很多人在初学 C++ 时被网上的文章与视频整得晕头转向,不同的文章质量,各种各样的版本,各种各样的IDE,有的会简单介绍一下每个的区别,有的则什么都不会说,而编译器的差异在一些地方也会有不同的结果,这对于新手就会更加不友好,因此本章我会做一个新手向的搭建攻略,帮助新手迈出编程的第一步。
一、minGW与MSVC的区别和选择
首先对于编译器的选择上,网上有很多的版本,比如 minGW、MSVC、Clang等等,但他们的区别却很少有人来说,其中 clang 因为用的比较少所以在这里不做说明,我们主要来谈谈 $95\%$ 的文章会选用的编译器:GCC 与 MSVC。
GCC
对于 GCC,因此我们就需要先知道GNU是什么。下面引用下比较专业的话:
GNU代表“GNU's Not Unix”的缩写,它是一个自由软件项目,旨在创建一个类似于Unix操作系统的开放源代码替代品。Richard Stallman于1983年发起了这个项目,他的目标是创建一个完全自由、开放、共享的操作系统,以便用户能够自由地运行、复制、分发、研究和修改它。
简单来讲 GNU 是一个自由软件项目,而其中有许多不同的工具和组件,而其中 GCC(GNU Compiler Collection,GNU编译器集合) 就是代表性的一个成果,在这里也特别说明一下,一般来讲 GCC和G++ 可以看为一个整体,虽然在编译 C 语言的代码时会用到 GCC,编译C++代码时会用到 G++,但实际上是GCC工具链的一部分。
简单介绍完 GNU 和 GCC 后,我们来说一说 minGW,对于之前的那些组件主要是运行在Linux系统上的,而其对应在Windows上运行的则是 minGW(MAC系统也有对应的版本,这里不做赘述),其中也包括了 GCC 组件,使得其可以在 Windows 上编译,且由于用的是同一个组件,使得在不同的平台使用起来基本是相同的,出现不同的点更多只在操作系统的环境差异上,所以其跨平台的优势很大,并且有很丰富的社区资源和标准性,而且是开源的。但也有一些缺点,比如需要自己安装配置集成开发环境(IDE)、编译速度较慢等等。
MSVC
MSVC的全称为Microsoft Visual C++,看名字我们就能知道这是由微软开发的C++编译器和开发工具套件,它一般是集成在 Microsoft Visual Studio 中,而且与IDE的适配非常好。与 GCC 不同的,MSVC主要针对平台是Windows系统,虽然牺牲了一些跨平台特性,但也因如此其对 Windows 上的优化很好,与 Windows API能更好的结合,且还自带了Windows SDK,这使得其在Windows开发上有了很大优势。但自身也存在一些缺陷,比如平台限制比较大,基本上是对标了Windows开发、闭源、兼容性问题(标准定义不同,会导致运行结果在一些场景下与GCC不同)、体积庞大的IDE(动不动20G+)。
将两款常用的编译器介绍完后,简单概括一下:GCC轻量且跨平台较好,适合学习探索;MSVC对Windows兼容性好,适合项目开发。因此在本文中,我们着重讲解在Windows平台下的 minGW 环境配置及第三方IDE安装。(其实Visual Studio更加无脑些,直接下载就可以)
二、minGW 下载及配置
下载部分
因为 GNU 本身就是国外的项目,因此如果在官网下载 minGW 就会非常耗时,这里给各位放一个离线版的链接,搭配迅雷下载速度较好:MinGW。在点击链接后,按照下图的操作来完成下载与解压,其中在选择下载版本时,posix 和 win32、sjlj 和 seh都会有一些区别,大家可以自行了解这里不过多展开,我下载的则是 x86_64-posix-sjlj 版本。(为了防止误删建议把mingw64文件夹内的所有文件拷贝到一个单独的地方)
环境搭建
在经过上述的操作后,C++搭建环境所需要的文件就准备完成了,下一步则是环境搭建。首先我们打开 mingw64 文件夹下的 bin 文件夹,复制资源管理器上面的路径地址(如图所示,每个人的可能都不一样但要确保是在bin目录下,且路径中最好不要有中文命名的文件夹),然后我们在桌面的此电脑处右击点击属性跳转到设置页面 ---> 在这里点击高级系统设置 ---> 点击环境变量 ---> 在上方 $Path$ 变量处双击 ---> 在新弹出的窗口点击新建 ---> 将刚刚复制的地址粘贴到文本栏中 ---> 点击确定(所有的窗口记得都点一下),下面将用图示来更详细演示一下。
这里说明下,我的电脑目前系统是win11,可能有的人版本与我不一样因此出现图片中的内容不同,但不管是什么版本文字都是不变的,在跳转到设置界面后找对应关键字即可,若有人桌面上没有此电脑图标,可以在开始菜单中点击设置 ---> 系统 ---> 系统信息来跳转到相同界面。
在进行上述的操作后,C++环境的搭建就已经完成了,现在我们需要来验证程序是否搭建好,首先我们按 win + R 键打开运行程序,然后输入 “cmd”,点回车会弹出一个黑色窗口(命令行),这时我们输入 g++ -v
,如果输出了很多英文,说明环境搭建成功,如果显示 “'g++' 不是内部或外部命令,也不是可运行的程序或批处理文件。”则搭建失败,请检查上面哪个步骤出现了问题。
显示文件拓展名
本身下一步中就可以直接写C++程序了,但是由于 Windows 的迷惑默认属性会把拓展名隐藏,所以要简单的说一下如何显示文件拓展名,这里以 win11系统为例,如果不在同一位置请找对应关键字。首先随便打开一个文件夹,点击上方的三点 ---> 属性 ---> 查看 ---> 向下滑 ---> 找到“隐藏已知文件类型的扩展名”并取消勾选 ---> 应用并确定。
第一个C++程序
在完成上述配置后我们就可以编写第一个C++程序了,随便找一个地方右击新建 ---> 文本文档 ---> 打开文本文档,在文档中打出如下代码:
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World" << endl;
return 0;
}
完成后保存文件并关闭,右击重命名文件名,这里我们用统一的 demo1.cpp
来命名,方便后续演示。最后我们在保存程序的文件夹内 按住 Shift 键然后右击,随后点击 “在此处打开 Powershell 窗口”这一选项,随后会弹出一个命令行窗口,此时在里面输入 g++ demo1.cpp -o demo1
,若没有任何提示说明编译完成,如果报错请检查代码是否和文中一样。最后一步,输入 ./demo1
,若屏幕中输出了 “Hello World” 语句,说明运行成功,也恭喜你完成了第一个C++程序。
简单说明编译指令
对于程序中的代码而言今后学习中都会讲到,而对于编译命令这种本身很重要的技能却没有人教,所以在这里也简单给大家讲一下刚刚的编译指令 g++ demo1.cpp -o demo1
的用处:
g++
:代表 C++ 编译用的程序,只要编译C++程序就一定需要这个命令,如果编译C语言则是 gcc;
demo1.cpp
:对应我们刚刚写的程序的文件名;
-o demo1
:这里要连起来看,-o 代表了将编译后的程序重命名,后面加的 demo1 则是重命名后的名字,默认情况下如果不重命名编译后的文件名则为 a.exe
。
所以总结下来,这个编译指令的含义就是:编译当前文件夹下的 demo1.cpp 文件,并将编译后的程序重命名为 demo1。细心的同学可以发现,编译后文件夹中多了一个 demo1.exe
的程序,这也就是编译后可以直接运行的程序,在最后一步我们执行的 ./demo1
也就是为了执行这个程序,./
在脚本中代表了运行的意思,后面紧接着的则为可执行程序。
三、VScode 安装及配置
其实对于编程的工具来讲理论上是记事本都可以满足一切需要,但是随着代码量的逐渐增多、文件越来越多,记事本就不能满足更多的需求了,对于 IDE(集成开发环境)可以有不同的颜色风格帮助阅读代码、代码补全、更好的debug工具等等,是对于程序员来讲非常好的助手,当然对于前期学习来讲也不建议使用太高级的IDE,这样会过度依赖 debug 功能和自动检查的功能,不利于前期学习,这些大家自行选择即可。对于minGW编译器而言我在这里推荐两款代码编辑器:DEV-C++和VScode,前者在这里不会多说,因为整个安装的过程过于无脑且自带了编译环境(也就是你不按照前面部分去配置也没关系),但界面太老旧辣眼功能太少,因此我平常使用他的频率不高。而对于VScode而言,首先开源,并且有着很丰富的社区生态、插件,一个编辑器可同时进行很多语言的开发,并且软件很小很轻量,用起来比较方便,但缺点是他是不自带有编译器的,需要自己配置,并且配置过程中会有很多的坑,但如果配置完整后也是一个神器,所以最后的时间我将教大家如何从零配置VScode。
下载安装
首先去搜索VScode并打开其官网,这里也贴出链接以防走错:VScode,点进来后大大的 Download就映入眼帘,直接点击下载即可,下载完成后打开,记得同意协议和勾选创建桌面快捷方式,并一路点下一步完成安装即可。
安装完成后打开,我们会发现目前界面是英文的,所以我们要先安装汉化插件,点击软件左侧第五个按钮-插件,在搜索栏中搜索 Chinese 看到搜索出的简体中文插件后点击 install,安装完成后右下角会提示我们更改并重启,点击即可。
重启后我们要安装C++插件,重复刚才的步骤,只是将搜索的内容换成C++并安装即可,如下图所示:
至此我们需要安装的插件都已经安装完成,下一步则是配置运行环境。
运行环境配置
我们创建一个文件夹,用于保存平常写的代码,需要格外注意一件事:文件夹的名字和文件夹所在的目录中不能出现任何中文名,这个判断的方法就是用前面提取地址的方法,如果里面有中文则需要换,没有则可以放心创建,一定要注意这件事,否则后面将会出现错误。
接下来我们可以在VScode的欢迎页中找到打开文件夹这一选项(如果没有欢迎页就点文件-->打开文件夹),将其定位到刚刚创建的文件夹的内部,点选择文件夹。
打开后在文件夹中创建名为 “.vscode” 的文件夹,并在 .vscode 文件夹中创建 $4$ 个文件,分别是:c_cpp_properties.json、launch.json、settings.json、tasks.json,
现在,分别往四个文件中粘贴一下内容,其中第一个文件(c_cpp_properties.json)和第二个文件(tasks.json)需要根据自己的情况更改路径,且与之前不同的,路径之间的 \ 号需要换为 \\,需要更换的地方已经特别注明,记住,只改引号里的,引号外的别改,下面是已经配置好的,参考配置好的模板去选择:
c_cpp_properties.json:
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"cStandard": "c11",
"cppStandard": "c++14",
"intelliSenseMode": "windows-gcc-x64",
"compilerPath": "E:\\mingw64\\bin\\g++.exe" //这里请更换成自己电脑上所存的 mingw 下的 g++.exe路径,并将路径中的 \ 换为 \\
}
],
"version": 4
}
launch.json:
// https://code.visualstudio.com/docs/cpp/launch-json-reference
{
"version": "0.2.0",
"configurations": [{
"name": "(gdb) Launch", // 配置名称,将会在启动配置的下拉菜单中显示
"type": "cppdbg", // 配置类型,对于C/C++可认为此处只能是cppdbg,由cpptools提供;不同编程语言不同
"request": "launch", // 可以为launch(启动)或attach(附加)
"program": "${fileDirname}/a.exe", // 将要进行调试的程序的路径
"args": [], // 程序调试时传递给程序的命令行参数,一般设为空
"stopAtEntry": false, // 设为true时程序将暂停在程序入口处,相当于在main上打断点
"cwd": "${workspaceFolder}", // 调试程序时的工作目录,此为工作区文件夹;改成${fileDirname}可变为文件所在目录
"environment": [], // 环境变量
"externalConsole": true, // 使用单独的cmd窗口,与其它IDE一致;为false时使用内置终端
"internalConsoleOptions": "neverOpen", // 如果不设为neverOpen,调试时会跳到“调试控制台”选项卡,你应该不需要对gdb手动输命令吧?
"MIMode": "gdb", // 指定连接的调试器,可以为gdb或lldb。但我没试过lldb
"miDebuggerPath": "gdb.exe", // 调试器路径,Windows下后缀不能省略,Linux下则不要
"setupCommands": [
{ // 模板自带,好像可以更好地显示STL容器的内容,具体作用自行Google
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": false
}
],
"preLaunchTask": "C/C++: g++.exe 生成活动文件" // 调试前执行的任务,一般为编译程序。与tasks.json的label相对应
}]
}
settings.json:
{
"files.associations": {
"ostream": "cpp",
"chrono": "cpp",
"random": "cpp",
"limits": "cpp",
"valarray": "cpp",
"iostream": "cpp",
"string": "cpp",
"thread": "cpp",
"*.tcc": "cpp",
"bitset": "cpp",
"codecvt": "cpp",
"string_view": "cpp",
"algorithm": "cpp",
"istream": "cpp",
"cmath": "cpp",
"stdexcept": "cpp",
"forward_list": "cpp",
"list": "cpp",
"unordered_map": "cpp",
"unordered_set": "cpp",
"vector": "cpp",
"sstream": "cpp",
"regex": "cpp",
"array": "cpp",
"complex": "cpp",
"scoped_allocator": "cpp",
"system_error": "cpp",
"tuple": "cpp",
"iosfwd": "cpp",
"deque": "cpp",
"atomic": "cpp",
"cctype": "cpp",
"cfenv": "cpp",
"charconv": "cpp",
"cinttypes": "cpp",
"clocale": "cpp",
"condition_variable": "cpp",
"csetjmp": "cpp",
"csignal": "cpp",
"cstdarg": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cstring": "cpp",
"ctime": "cpp",
"cuchar": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"exception": "cpp",
"functional": "cpp",
"iterator": "cpp",
"map": "cpp",
"memory": "cpp",
"memory_resource": "cpp",
"numeric": "cpp",
"optional": "cpp",
"ratio": "cpp",
"set": "cpp",
"type_traits": "cpp",
"utility": "cpp",
"fstream": "cpp",
"future": "cpp",
"initializer_list": "cpp",
"iomanip": "cpp",
"mutex": "cpp",
"new": "cpp",
"shared_mutex": "cpp",
"streambuf": "cpp",
"typeindex": "cpp",
"typeinfo": "cpp",
"stdio.h": "c"
}
}
tasks.json:
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe 生成活动文件",
"command": "E:\\mingw64\\bin\\g++.exe",//这里同上面文件,请换成自己存储的g++所在路径
"args": [
"-std=c++11",
"-O0",
"-Wl,--stack=268435456",
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}\\a.exe",
"-g",
"-fexec-charset=GBK"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
实验程序
完成上述操作后,我们创建一个C++文件,记住创建程序应该在 .vscode 文件夹之外,注意不要创建错位置,然后继续写上我们最初运行的代码,Ctrl + S 保存后点击上面的运行 ---> 以非调试模式运行,然后·····会发现一个黑框闪了一下就消失了。
这是因为VScode会单独调起一个终端来运行程序,程序执行完后终端就会自动关闭,因此我们需要加一行代码:system("pause");
来维持窗口的出现,直到按回车键程序才会结束,这样就可以完美运行我们刚刚的程序啦!
断点调试
VScode不仅拥有更好的代码补全与颜色上的区分,还有着强大的断点调试工具,但因为篇幅原因这里就不去说断点的原理,而是教大家怎么开启断点调试。在程序的左侧有程序对应的行号,将当鼠标悬浮在行号上时左侧将出现一个红点,单击红点则加入了断点调试,再次点击则取消了断点调试,再加完断点以后如果想让断点生效,需要在运行中选择启动调试,这样断点就会生效,程序会弹出调试界面,而调试的操作,就等各位以后自己去探索啦!
可能出现的问题
1.若在加入 json 文件后无法正常运行程序,去检查路径中是否存在中文路径、其中的两个中文文件路径修改是否正确;
2.程序本身的命名是允许采用中文的,但是若采用断点调试,则程序必须不出现中文字符,否则断点会无法生效,这是gdb的特性;
3.对于json文件的内部,本身不需要要求掌握,等阅历慢慢的提高了,自然也就明白了每个参数的意思。
四、总结
这篇文章为新手保姆级的环境搭建系列,期间其实在截图上消耗了不少经历,希望这篇文章可以帮助更多人走出搭建环境的雷区,顺利踏入编程的世界,也希望可以多多支持。
最后,祝各位在编程的学习中一路顺风!