vscode c/c++ 配置

https://code.visualstudio.com/docs/languages/cpp

一、什么是 MinGW-w64 ?
MinGW 的全称是:Minimalist GNU on Windows 。它实际上是将经典的开源 C语言 编译器 GCC 移植到了 Windows 平台下,并且包含了 Win32API ,因此可以将源代码编译为可在 Windows 中运行的可执行程序。而且还可以使用一些 Windows 不具备的,Linux平台下的开发工具。一句话来概括:MinGW 就是 GCC 的 Windows 版本 。
以上是 MinGW 的介绍,MinGW-w64 与 MinGW 的区别在于 MinGW 只能编译生成32位可执行程序,而 MinGW-w64 则可以编译生成 64位 或 32位 可执行程序。

二、为什么使用 MinGW-w64 ?

  1. MinGW-w64 是开源软件,可以免费使用。
  2. MinGW-w64 由一个活跃的开源社区在持续维护,因此不会过时。
  3. MinGW-w64 支持最新的 C语言 标准。
  4. MinGW-w64 使用 Windows 的C语言运行库,因此编译出的程序不需要第三方 DLL ,可以直接在 Windows 下运行。
  5. 那些著名的开源 IDE 实际只是将 MinGW-w64 封装了起来,使它拥有友好的图形化界面,简化了操作,但内部核心仍然是 MinGW-w64。
    MinGW-w64 是稳定可靠的、持续更新的 C/C++ 编译器,使用它可以免去很多麻烦,不用担心跟不上时代,也不用担心编译器本身有bug,可以放心的去编写程序。

三、MinGW-w64 适合做什么?
对于熟悉 MinGW-w64 的高手而言,它可以编译任何 C语言 程序。但对于一般人来说,MinGW-w64 太过简陋,连图形用户界面都没有。这让习惯使用鼠标的人,感到很痛苦。虽然也可以通过一些配置,让 MinGW-w64 拥有图形用户界面,但那个过程非常麻烦。
除此之外,编译复杂的程序时,还需要你会编写 Makefile ,否则只能一个文件一个文件的编译,可想而知会多么辛苦。
但对于初学 C语言 的人来说,MinGW-w64 是正合适的编译器,至少黑色的命令提示符界面很有编程的气氛,感觉很酷。
在刚开始学 C语言 时,所有代码通常都写在一个文件中,只要输入几个简单的命令,就能用 MinGW-w64 编译成可执行文件。虽然 VS2015 等编译器,只要点击下鼠标就可以完成编译,但它会自动生成一大堆工程文件,让初学者摸不着头脑。而 MinGW-w64 则只会生成一个可执行文件。
如果对 MinGW-w64 和 VS2015 等编译器进行一下形容,那么 MinGW-w64 是手动的,而 VS2015 等编译器则是自动的。因此 MinGW-w64 的编译过程更加直观容易理解,也比较适合C语言学习。
总而言之,对于一般人来说,MinGW-w64 适合学习 C语言 时使用,真正工作还是用 VS2015 更好。当然如果您是在 Linux 下工作,那么Code::Blocks可能是一个选择,不过最大的可能是您必须习惯使用 GCC 来编译程序。

四、下载和安装 MinGW-w64
在开始安装之前,请先确认您满足以下几个条件。
1.您的电脑已经连接到网络。
2.您的电脑硬盘有500MB的剩余空间。
3.您现在有充足的时间。(受您当前网速的影响,安装过程可能会花费10几分钟或1个小时以上的时间。)

1.MinGW-w64官方网站首页(http://mingw-w64.org/)
vscode c/c++ 配置_第1张图片操作:点击红框中的“Downloads”超链接,进入 MinGW-w64 下载详情页面。

2.MinGW-w64下载详情页面

vscode c/c++ 配置_第2张图片
操作:点击红框中的“SourceForge”超链接,就会进入 SourceForge 中的 MinGW-w64 下载页面。

3.SourceForge 中的 MinGW-w64 下载页面

vscode c/c++ 配置_第3张图片

操作:点击红框中的“Download mingw-w64-install.exe”超链接,将会下载这个 MinGW-w64 自动安装的程序。

4.等待 MinGW-w64 安装程序开始下载
vscode c/c++ 配置_第4张图片
5.正在下载 mingw-w64-intall.exe
在这里插入图片描述

操作:只需等待。

6.MinGW-w64 安装程序

7.MinGW-w64 安装程序欢迎界面

vscode c/c++ 配置_第5张图片操作:点击红框中的 “Next” 按钮,将会进入下一步安装步骤。

8.从服务器获取 MinGW-w64 文件信息
在这里插入图片描述
vscode c/c++ 配置_第6张图片

9.MinGW-w64 版本选择
10.选择 gcc 版本
11.选择电脑系统架构
12.选择操作系统接口协议
说明:这个世界上只有两种操作系统,符合 posix 协议的,和 Windows 。如这个笑话所说的,如果你想要开发 Windows 程序,需要选择 win32 ,而开发 Linux、Unix、Mac OS 等其他操作系统下的程序,则需要选择 posix 。
操作:我只开发在 Windows 下运行的程序,所以选择了 win32
13.选择异常处理模型(64位)
说明:异常处理在开发中非常重要,你在开发的过程中,大部分的时间会耗在处理各种异常情况上。如果你之前选择了 64位,则这里有两个异常处理模型供你选择,seh 是新发明的,而 sjlj 则是古老的。seh 性能比较好,但不支持 32位。 sjlj 稳定性好,支持 32位。
操作:我这里选择了 seh 。
14.选择异常处理模型(32位)
说明:选择了 32位 后,则可以用 dwarf 和 sjlj 两种异常处理模型。同样的,dwarf 的性能要优于 sjlj ,可以它不支持 64位 。
操作:建议选择 dwarf 。

15.建立修订
16.MinGW-w64 版本选择完成
vscode c/c++ 配置_第7张图片
说明:绿框中就是我的 MinGW-w64 安装配置单,gcc 是 6.2.0 版本,系统架构是 64位,接口协议是 win32,异常处理模型是 seh,Build revision 是 1 。
操作:点击红框中的“Next”按钮,进入下一个步骤。

17.选择 MinGW-w64 的安装目录
vscode c/c++ 配置_第8张图片
说明:在这里选择 MinGW-w64 将要安装到哪个目录中去。安装程序默认会将 MinGW-w64 安装在 C盘 ,而在 Windows 操作系统中 C盘 是系统盘,操作系统会被安装在这个盘里,而按照一般的习惯,我们尽量不把应用软件安装载系统盘里。因为以前的电脑使用的是机械硬盘,而机械硬盘频繁读写会降低效率,所以尽量将操作系统与应用软件放在不同的硬盘分区下。当然,现在的电脑大部分都配备了固态硬盘(SSD),而且通常作为系统盘来使用,因此已经没有读写效率的问题了。所以如果你还在用机械键盘,就将 MinGW-w64 放到其他非系统盘里,如果使用固态硬盘,则可以放在安装程序提示的默认位置,或其他地方均可。
操作:点击红框中的“Browse”按钮,以便更改 MinGW-w64 的安装位置。

18.更改 MinGW-w64 的安装位置

19.确认 MinGW-w64 安装目录

vscode c/c++ 配置_第9张图片
说明:界面中的 Space available 指的是你选择的目录,所在的硬盘分区的剩余空间,而 MinGW-w64 至少会占用 500 MB 的空间。Create shortcuts in Start Menu 是说在开始菜单创建 MinGW-w64 的快捷方式,一般默认勾选即可。
操作:确认安装目录没问题后,点击红框中的“Next”按钮,开始正式安装 MinGW-w64 。

20.开始下载 MinGW-w64 本体
vscode c/c++ 配置_第10张图片
21.MinGW-w64 下载完成

vscode c/c++ 配置_第11张图片
22.关闭 MinGW-w64 安装程序

vscode c/c++ 配置_第12张图片
说明:MinGW-w64 的安装程序已经完成了它的使命,但 MinGW-w64 还没有安装完成,之后我们还需要进行一些配置,才能正常使用它编译源代码。
操作:点击红框中的“Finish”按钮,将关闭 MinGW-w64 安装程序。

23.MinGW-w64 安装目录

vscode c/c++ 配置_第13张图片
说明:MinGW-w64 下载完成后的安装目录,包含1个文件夹:mingw64,3个文件:mingw-w64.bat、uninstall.exe、uninstall.ini,和1个快捷方式:mingw-w64。虽然 MinGW-w64 已经下载完成,但并没有安装完成,我们还需要配置一下操作系统的环境变量,将 MinGW-w64 的 bin 目录加入其中,使操作系统可以找到那些编译工具。
操作:双击红框中的“mingw64”文件夹,进入其中。

24.MinGW-w64 的 mingw64 文件夹

vscode c/c++ 配置_第14张图片
说明:mingw64 中包含了一系列的文件夹,根据文件夹的名称,大概能猜到它们是做什么用的,但我们暂时不需要完全明白,只需要知道其中 bin 文件夹中,存放了那些编译工具即可。
操作:双击红框中的“bin”文件夹,进入其中。

25.MinGW-w64 的 bin 文件夹
vscode c/c++ 配置_第15张图片
说明:bin 文件夹下包含了很多后缀名是 .exe 的可执行程序,这些就是开发时所需的工具,如:gcc.exe 是用来编译 C程序的,g++.exe 是用来编译 C++ 程序的,而 gdb.exe 则是用来调试程序的 debug 工具。
操作:点击红框中的地址栏,并复制(Ctrl + c)那一串地址。

26.此电脑

vscode c/c++ 配置_第16张图片

说明:我们已经复制了 MinGW-w64 的 bin 文件夹的地址,接下来只要将它添加到系统的环境变量中,就可以完成 MinGW-w64 的全部配置了。
操作:右键点击“此电脑”,在弹出的菜单中点击红框中的“属性”项。

27.计算机系统窗口
vscode c/c++ 配置_第17张图片

说明:这个窗口也可以通过“控制面板” -> “系统和安全” -> “系统”来打开。如果你不知道自己的系统是 32位 还是 64位,也可以在这里查看。
操作:点击红框中的“高级系统设置”链接,将打开“系统属性”窗口。

28.系统属性窗口

vscode c/c++ 配置_第18张图片
说明:所谓的“环境变量”其实就是各种程序的默认安装目录,在那里有可执行程序。
操作:点击红框中的“环境变量”按钮,将打开“环境变量”窗口。

29.系统环境变量窗口

vscode c/c++ 配置_第19张图片
说明:在这个窗口中我们可以编辑系统的环境变量,很多软件在安装的时候,会自动编辑环境变量。MinGW-w64 的安装程序比较简陋,只能由我们手动编辑。
操作:首先点击选中绿框中的“Path”项,然后再点击红框中的“编辑”按钮。

30.编辑 Path 环境变量

vscode c/c++ 配置_第20张图片说明:这是 Windows 10 中的编辑界面,比之前的版本要清晰明了,操作简单了很多,也不容易出错了。
操作:点击红框中的“新建”按钮,将创建一个新的空白变量位置。

31.新建 MinGW-w64 的环境变量

vscode c/c++ 配置_第21张图片
说明:现在只需将之前复制的 MinGW-w64 的 bin 文件夹地址,复制到新增的空白变量位置里,即可完成 MinGW-w64 的配置工作。
操作:将 bin 文件夹地址,黏贴到红框中的输入框中。

32.添加 MinGW-w64 环境变量已完成

vscode c/c++ 配置_第22张图片
…黑窗口测试

六、一些额外的设置
这些额外的设置,可以使 MinGW-w64 使用起来更方便。因为“gcc”命令有些麻烦,每次编译都要输入类似“gcc hello.c -o hello.exe”这样的一串字符,所以我们为了简化这一步骤,转而使用“make”命令。只是“make”是 Linux 和 类Unix 下的工具,所以在 MinGW-w64 中需要一些额外的修改。

1).创建 gcc.exe 的副本 cc.exe
vscode c/c++ 配置_第23张图片
首先复制一个“gcc.exe”的副本,然后将其更名为“cc.exe”即可。

2).创建 mingw32-make.exe 的副本 make.exe
vscode c/c++ 配置_第24张图片

与对“gcc.exe”的操作相同,复制一个“mingw32-make”的副本,然后更名为“make.exe”。

3).使用 make 命令编译源代码

现在我们就可以使用“make”命令来编译源代码,只需要输入“make hello”即可编译生成“hello.exe”了。

上述只是简单的编译源代码的方法,适用于单个或少量源代码文件,如果是复杂的大型程序,要用到 makefile 来组织源代码时,就需要 mingw32-make(修改后使用 make) 命令了

配置vscode

完全卸载
如果大家之前有安装过VSCode,然后只是简单卸载的话,再次安装之后,是还出现之前的配置信息,包括打开的文件夹、安装过的扩展等,这是因为之前并没有完全将VSCode卸载干净。如果想干净卸载掉VSCode再重新安装的话,就需要在卸载之后再删除掉两个目录的内容。分别是:

C:\Users\$用户名\.vscode
C:\Users\$用户名\AppData\Roaming\Code【注】这里的“$用户名”根据
自己的用户名而定。

删除掉这两个目录的内容之后,如果再安装VSCode的话,就相当于是全新安装了,即不会出现之前的相关配置信息了
我们总共需要在 .vscode 文件夹下创建如下3个文件:

配置C/C++环境
(1).配置编译器
接下来配置编译器路径,按快捷键Ctrl+Shift+P调出命令面板,输入C/C++,选择“Edit Configurations(UI)”进入配置。这里配置两个选项: - 编译器路径:D:/mingw-w64/x86_64-8.1.0-win32-seh-rt_v6-rev0/mingw64/bin/g++.exe

这里的路径根据大家自己安装的Mingw编译器位置和配置的环境变量位置所决定。

  tasks.json (生成任务。告诉 VSCode 如何生成(编译)程序,该任务将调用 g++ 编译
  器以基于源代码创建可执行文件)launch.json (调试器设置)c_cpp_properties.json 
  (编译器路径和 IntelliSense 设置)
  1. 创建 C++ 示例代码文件 Hello World,并保存,确保存在于文件夹中,而非临时文件
示例代码:

#include 
#include 
#include 

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;
}
 
  1. 配置 tasks.json,用于编译
a. 配置tasks.json

菜单 > 终端 > 配置默认生成任务
下拉列表中,列出了 C++ 编译器的各种预定义构建任务。选择 C/C++: g++.exe build 
active file。若是 C,请选择 C/C++: gcc.exe build active file,C 无法使用 
g++.exe

    Note: 是 C 还是 C++ 是根据文件后缀名来判断的,而非根据右下角选择的语言
完成后会在 .vscode 文件夹下创建 task.json 文件并打开

部分变量说明:

            command 设置指定要运行的程序;在这种情况下是 g++ args 数组指定
将传递给 g++ 的命令行参数。必须按照编译器期望的顺序指定这些参数。 此任务告诉 
g++ 获取活动文件(${file}),对其进行编译,并在当前目录(${fileDirname})中
创建一个与活动文件同名但以 .exe 为扩展名(${fileBasenameNoExtension}.exe)
的可执行文件,如 helloworld.exe 。可使用"${workspaceFolder}\\*.cpp"来替换 
${file},这将生成当前文件夹中的所有 .cpp 文件label 是在任务列表中显示的值,
可以随意命名group 中 "isDefault": true 指定当按 Ctrl + Shift + B 时将运行
此任务。此属性仅出于方便起见;如果设置为 false,仍然可以使用“ 任务:运行构建
任务”从“终端”菜单中运行gourp 中的 "isDefault": true,指定当按下 Ctrl + 
Shift + B 时将运行此任务。此属性仅出于方便起见;如果将其设置为 false,仍可以
使用“ 运行生成任务”从“终端”菜单中运行 

附 task.json 变量参考

b. 运行生成任务,编译

回到 helloworld.cpp,按 Ctrl + Shift + B 或从“ 终端”菜单中选择“ 运行生成任
务”成功如图所示

且当前文件夹下会多出一个 helloworld.exe 文件,可以使用”+“按钮新建一个终端,
用来执行它,输入.\helloworld.exe

vscode c/c++ 配置_第25张图片

配置json文件

非常重要的一步,这四个json文件可以直接拷贝使用,根据注释可以自己修改,一般新手
的话不建议修改,只需要修改的可能是c_cpp_properties.json文件
先创建一个你打算存放代码的文件夹(称作工作区),路径不能含有中文和空格和引号。
c语言和c++需要建立不同的工作区(除非你懂得下面json文件的某些选项,则可以做到
一个工作区使用不同的build task)。
打开VS Code,选打开文件夹(不要选“添加工作区文件夹”,理由见上一句),选择刚才
那个文件夹,点VS Code上的新建文件夹,名称为.vscode(这样做的原因是Windows的
Explorer不允许创建的文件夹第一个字符是点)然后创建 launch.json,tasks.json,settings.json,c_cpp_properties.json放到.vscode文件夹下,

launch.json代码:

stopAtEntry可根据自己喜好修改;
cwd可以控制程序运行时的相对路径,如有需要可以改为${fileDirname}。
其他无需更改,除非你不用windows,则可以用lldb调试(需要自己装)。
type和request不变色是正常现象。
// https://github.com/Microsoft/vscode-cpptools/blob/master/launch.md
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch", // 配置名称,将会在启动配置的下拉菜单中显示
            "type": "cppdbg", // 配置类型,这里只能为cppdbg
            "request": "launch", // 请求配置类型,可以为launch(启动)或attach(附加)
            "program": "${fileDirname}/${fileBasenameNoExtension}.exe", // 将要进行调试的程序的路径
            "args": [], // 程序调试时传递给程序的命令行参数,一般设为空即可
            "stopAtEntry": true, // 设为true时程序将暂停在程序入口处,我一般设置为true
            "cwd": "${workspaceFolder}", // 调试程序时的工作目录
            "environment": [], // (环境变量?)
            "externalConsole": true, // 调试时是否显示控制台窗口,一般设置为true显示控制台
            "internalConsoleOptions": "neverOpen", // 如果不设为neverOpen,调试时会跳到“调试控制台”选项卡,你应该不需要对gdb手动输命令吧?
            "MIMode": "gdb", // 指定连接的调试器,可以为gdb或lldb。但目前lldb在windows下没有预编译好的版本。
            "miDebuggerPath": "gdb.exe", // 调试器路径。
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": false
                }
            ],
            "preLaunchTask": "Compile" // 调试会话开始前执行的任务,一般为编译程序。与tasks.json的label相对应
        }
    ]
}

tasks.json代码:

reveal可根据自己喜好修改,即使设为never,也只是编译时不跳转到“终端”而已,手动点进去还是可以看到,我个人设为never。

命令行参数方面,-std根据自己的需要修改。如果使用Clang编写C语言,把command的值改成clang。

如果使用MinGW,编译C用gcc,编译c++用g++,并把-target和-fcolor那两条删去。如果不想要额外警告,把-Wall那一条删去。

// https://code.visualstudio.com/docs/editor/tasks
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Compile", // 任务名称,与launch.json的preLaunchTask相对应
            "command": "clang++", // 要使用的编译器
            "args": [
                "${file}",
                "-o", // 指定输出文件名,不加该参数则默认输出a.exe
                "${fileDirname}/${fileBasenameNoExtension}.exe",
                "-g", // 生成和调试有关的信息
                "-Wall", // 开启额外警告
                "-static-libgcc", // 静态链接
                "-fcolor-diagnostics",
                "--target=x86_64-w64-mingw", // 默认target为msvc,不加这一条就会找不到头文件
                "-std=c++17" // C语言最新标准为c11,或根据自己的需要进行修改
            ], // 编译命令参数
            "type": "shell",
            "group": {
                "kind": "build",
                "isDefault": true // 设为false可做到一个tasks.json配置多个编译指令,需要自己修改本文件,我这里不多提
            },
            "presentation": {
                "echo": true,
                "reveal": "always", // 在“终端”中显示编译信息的策略,可以为always,silent,never。具体参见VSC的文档
                "focus": false, // 设为true后可以使执行task时焦点聚集在终端,但对编译c和c++来说,设为true没有意义
                "panel": "shared" // 不同的文件的编译信息共享一个终端面板
            }
            // "problemMatcher":"$gcc" // 如果你不使用clang,去掉前面的注释符,并在上一条之后加个逗号。照着我的教程做的不需要改(也可以把这行删去)
        }
    ]
}

settings.json代码:

把这个文件里的东西放到“用户设置”里也可以覆盖全局设置,自己进行选择。

Code Runner的命令行和某些选项可以根据自己的需要在此处修改,用法还是参见此扩展的文档和百度gcc使用教程。

如果你要使用其他地方的头文件和库文件,可能要往clang.cflags和clang.cxxflags里加-I和-L,用法百度gcc使用教程。

clang的补全,在我过去的测试过程中会让VSC非常卡,但是现在好像没有这个问题了。

如果你卡,就把clang的补全关掉,用cpptools的。
Linux下去掉code runner和flags的--target那一条,共四个。
{
    "files.defaultLanguage": "cpp", // ctrl+N新建文件后默认的语言
    "editor.formatOnType": true, // 输入时就进行格式化,默认触发字符较少,分号可以触发
    "editor.snippetSuggestions": "top", // snippets代码优先显示补全

    "code-runner.runInTerminal": true, // 设置成false会在“输出”中输出,无法输入
    "code-runner.executorMap": {
        "c": "cd $dir && clang $fileName -o $fileNameWithoutExt.exe -Wall -g -Og -static-libgcc -fcolor-diagnostics --target=x86_64-w64-mingw -std=c11 && $dir$fileNameWithoutExt",
        "cpp": "cd $dir && clang++ $fileName -o $fileNameWithoutExt.exe -Wall -g -Og -static-libgcc -fcolor-diagnostics --target=x86_64-w64-mingw -std=c++17 && $dir$fileNameWithoutExt"
    }, // 设置code runner的命令行
    "code-runner.saveFileBeforeRun": true, // run code前保存
    "code-runner.preserveFocus": true, // 若为false,run code后光标会聚焦到终端上。如果需要频繁输入数据可设为false
    "code-runner.clearPreviousOutput": false, // 每次run code前清空属于code runner的终端消息

    "C_Cpp.clang_format_sortIncludes": true, // 格式化时调整include的顺序(按字母排序)
    "C_Cpp.intelliSenseEngine": "Default", // 可以为Default或Tag Parser,后者较老,功能较简单。具体差别参考cpptools扩展文档
    "C_Cpp.errorSquiggles": "Disabled", // 因为有clang的lint,所以关掉
    "C_Cpp.autocomplete": "Disabled", // 因为有clang的补全,所以关掉

    "clang.cflags": [ // 控制c语言静态检测的参数
        "--target=x86_64-w64-mingw",
        "-std=c11",
        "-Wall"
    ],
    "clang.cxxflags": [ // 控制c++静态检测时的参数
        "--target=x86_64-w64-mingw",
        "-std=c++17",
        "-Wall"
    ],
    "clang.completion.enable":true // 效果效果比cpptools要好
}


c_cpp_properties.json代码:

文件内容来自于Microsoft/vscode-cpptools;这个json不允许有注释(其实按照标准本来就不能有)。

如果你没有合并Clang和MinGW,则该文件中的compilerPath必需修改成MinGW的完整路径,精确到gcc.exe,否则会提示找不到头文件;Linux下应该是/usr/bin/gcc。

如果你自己编写了头文件又不在workspaceFolder下,路径也要加到includePath和browse里。这些路径是否递归有效暂时未知,我的测试是有效的。

Windows下的路径为反斜杠,原本应使用两个反斜杠来转义,但直接用斜杠在VS Code中也接受。

一般只有这里面那个compilePath改成自己的路径

{
    "configurations": [
        {
            "name": "MinGW",
            "intelliSenseMode": "clang-x64",
            "compilerPath": "C:/Program Files/LLVM/bin/gcc.exe",
            "includePath": [
                "${workspaceFolder}"
            ],
            "defines": [],
            "browse": {
                "path": [
                    "${workspaceFolder}"
                ],
                "limitSymbolsToIncludedHeaders": true,
                "databaseFilename": ""
            },
            "cStandard": "c11",
            "cppStandard": "c++17"
        }
    ],
    "version": 4
}

你可能感兴趣的:(c/c++_study,c++)