VSCode开发C、C++环境搭建系列(一)——基于Mingw-w64搭建

前言:本次系列文章详细说明基于VS Code来搭建C、C++的开发环境,本次的操作系统是Windows系统,在Windows上面,会有两种不同主流编译器,及Mingw-W64和MSVC,本文介绍第一种,是系列文章的第一篇。

概念辨析:

Mingw-w64。是 GCC 的 Windows 版本 ;

Cygwin。是一个在windows平台上运行的类UNIX模拟环境,在Windows上面提供类似与Linux的开发环境,但是需要注意的是,在Linux上面的程序并不能直接拿过来运行,而是需要在Cygwin环境之下重新编译才行;

MSYS2。是一个体验非常好的linux模拟环境,可以移植大多数linux上面的程序,起源于cygwin,是Cygwin的一个升级版本。

一、Mingw-w64介绍以及如何安装

1.1 什么是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 现已被 MinGW-w64 所取代,且 MinGW 也早已停止了更新,内置的 GCC 停滞在了 4.8.1 版本,而 MinGW-w64 内置的 GCC 则更新到了 6.2.0 版本。

1.2 安装Mingw-w64

Mingw-w64的安装有两种方式,在线安装和离线形式,其中在线形式有时候会遇到各种问题,比如什么cann't download repository.txt,尚没有找到好的解决办法,关于在线安装可以参考这篇文章。

MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本

离线形式非常简单,解压即可以使用,不需要往外安装,但是需要选择正确合适的版本和相关配置才行,

离线下载的网址为:

https://sourceforge.net/projects/mingw-w64/files/?source=navbar

界面如下所示:

我们发现每一个版本里面有8个不同的文件,那到底选择哪一个呢?这里需要涉及到一些基础知识,我将在下面分别介绍。

(1)电脑的处理器架构Architecture

Architecture 是指电脑处理器是 32位 还是 64位,根据你的电脑系统做出对应选择。我的电脑处理器是 64位 的,所以我选择了 x86_64,如果你是 32位 系统,则选择 i686 即可。注意,下面是可以选择的Architecture类型:

1、i386   通常被用来作为对Intel(英特尔)32位微处理器的统称;

2、i686   是i386的子集,也是针对32位的处理器

3、x86-64   又称“AMD64”或“x64”,是一种64位元的电脑处理器架构。它是建基于现有32位元的x86架构,由AMD公司所开发。

(2)操作系统接口协议threads

这个世界上只有两种操作系统接口协议,即所谓的posix和win32,如果你想要开发 Windows 程序,需要选择 win32 ,而开发 Linux、Unix、Mac OS 等其他操作系统下的程序,则需要选择 posix 。其实是什么意思呢?就是在这两个不同的协议之下,有很多函数接口是不一样的,比如在Linux上面的C程序不能直接拿到Windows上面运行,因为有一些函数库是不一样的。

操作:我只开发在 Windows 下运行的程序,所以选择了 win32 。

但是,我们依然更加推荐选择POSIX,为什么呢?

  • posix :启用C ++ 11 / C11多线程功能。 比如我们希望编译OpenCV,需要用到C++ 11的多线程里面的一些类,如果使用的是win32,就会报错,因为win32没有这些类。
  • win32 :没有C ++ 11多线程功能。

那是不是意味着如果我要使用win32的 API,就不能使用POSIX呢?

不是的。其实GCC带有一个编译器运行库(libgcc),它用于(除其他外)提供一个底层操作系统抽象,用于支持多语言相关功能。 最相关的例子是libstdc ++的C ++ 11  ,  ,当使用内部的Win32线程模型构建GCC时,没有完整的实现。 MinGW-w64提供了一个winpthreads(在Win32多线程API之上的一个pthreads实现),然后GCC可以链接到所有的奇特功能。

综上所述,我们选择:POSIX 更好!!!

那到底什么是POSIX呢?

POSIX:可移植操作系统接口,是 IEEE 为要在各种 UNIX 操作系统上运行软件,而定义API的一系列互相关联的标准的总称。

(3)异常处理模型Exception

异常处理在开发中非常重要,你在开发的过程中,大部分的时间会耗在处理各种异常情况上。又分为几种情况:

x86_64 即64位处理器。如果你之前选择了 64位,则这里有两个异常处理模型供你选择,seh 是新发明的,而 sjlj 则是古老的,seh 性能比较好,但不支持 32位。 sjlj 稳定性好,支持 32位。我选择seh.

i686 即32位处理器。选择了 32位 后,则可以用 dwarf 和 sjlj 两种异常处理模型。同样的,dwarf 的性能要优于 sjlj ,可以它不支持 64位 。建议选择 dwarf 。

总结:Mingw-w64的离线文件命名格式为“architecture+threads+exception",我选择的是上面图片中蓝色圈出来的那个。

下载之后的压缩文件大小为47M多,下载之后进行解压,解压之后大概430M多,放在任意位置即可,由于不需要安装,我将其解压到下面的文件位置:

D:\Program Files\mingw64

里面包含的文件以及文件夹有

打开里面的那个bin文件夹,里面包含几个关键的可执行程序,包括:

  • gcc.exe
  • g++.exe
  • mingw32-make.exe,这个就相当于是Linux下面的make.exe。单个按我们也可以创建一个他的副本,重命名为make.exe.
  • gdb.exe 用于调试的
  • cpp.exe 是专门用于预处理的
  • as.exe 是专门用于进行汇编的
  • ld.exe 是专门进行链接的

现在需要将这个bin目录添加到环境变量PATH里面。然后在cmd中查看如下:

#include 
#include 
#include using namespace std;//自定义一个函数
int add(int a,int b)
{return a+b;
}int main()
{vector msg {"Hello", "C++", "World", "from", "VS Code!"};for (const string& word : msg){cout << word << " ";}cout << endl;int c;c=add(100,200);printf("a+b=%d",c);
}

3.1 编译(build/compile)

执行 ”终端/运行生成任务...“ 或者是按快捷键 Ctrl+Shift+B ,则开始了编译过程,在终端会显示这样一句话:

> Executing task: g++ -g -o helloworld helloworld.cpp <

这就是使用g++进行编译的过程嘛。完成之后,会在当前目录之下出现一个helloworld.exe的可执行文件。

3.2 调试或者是执行

直接执行,按下Ctrl+F5,得到如下结果:

Hello C++ World from VS Code! 
a+b=300

或者设置断点,按F5进行调试。

 

四、GCC编译器在编译的时候如何找寻函数库与头文件

前面说了在Mingw-w64的目录之下,有include和lib等一系列的文件夹,都是编译器自带的头和库,你要的标准库头文件就在这里。对普通用户来说我们别别往里乱放东西。当然你的第三方库可以放在这里,这些目录都是mingw64会默认搜索的路径,在这两目录下也有些编译带的库。

那么GCC如何找到这里的呢,及如何搜索到的呢?

在比较老的Mingw编译器上,我们需要设置下面几个环境变量:

  • C_INCLUDE_PATH            // C的头文件库,一个或者是多个路径
  • CPLUS_INCLUDE_PATH  //C++的头文件库,一个或者是多个路径
  • OBJC_INCLUDE_PATH      //objective-C的头文件
  • LIBRARY_PATH                 // 标准库函数的路径(静态库)
  • LD_LIBRARY_PATH          //  动态库

以上三个变量的路径的,而最近几版的Mingw64只要设置好bin目录环境变量(主目录下的bin目录),编译器就会自己在以上的头和库的路径中自动查找了,但你仍然可以手动指定。

其实用户头和库无所谓放哪,都是可以用参数指定的。而且很多第三方库带pkg-config。可以轻松得到编译参数(包括了头和库的路径)

关于GCC更加详细的用法,后面会有专门的文章进行讲解的。
 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部