MinGW 也许真的不是真的 YYDS

献给那些喜欢在windows 上使用 GNU的小伙伴们吧,浅谈浅谈哈

 ** 百度百科

         MinGW是Minimalist GNU for Windows的缩写。它是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你在GNU/Linux和Windows平台生成本地的Windows程序而不需要第三方C运行时(C Runtime)库。MinGW 是一组包含文件和端口库,其功能是允许控制台模式的程序使用微软的标准C运行时(C Runtime)库(MSVCRT.DLL),该库在所有的 NT OS 上有效,在所有的 Windows 95发行版以上的 Windows OS 有效,使用基本运行时,你可以使用 GCC 写控制台模式的符合美国标准化组织(ANSI)程序,可以使用微软提供的 C 运行时(C Runtime)扩展,与基本运行时相结合,就可以有充分的权利既使用 CRT(C Runtime)又使用 WindowsAPI功能。

 ** 发展历史

1995年Cygnus的一位工程师Steve Chamberlain,观察到GNU的工具链已经支持x86和COFF的目标文件,而且还提供了可移植到任意平台的C标准库newlib,与那时的windows系统使用相同的目标文件,那么理论上只要将GCC重定向,并作为一个 cross-compiler,那么GCC 编译器就可以生成 Windows平台下的可执行文件, Steve开发出原型, 命名为Cygwin。 有了Cygwin 就可以使用GCC 生成windows 平台的程序了,于是为了 GCC用起来更舒服,Steve 尝试在 windows下构建 Shell 脚本运行环境,即是需要一个与bourne shell 兼容的命令解释器[Bash],因此需要一个 fork系统实现程序的调用和标准输入输出,windows 包含的类似接口和 posix不兼容,于是 cygwin就需要一套与 posix兼容的编程接口,从而提供了一套抽象层dll,最典型的cygwin1.dll。截至至此都是 Steve 一个人完成的,后来到了1996年,其他工程师也加入了进来。随着 Linux 系统发展壮大,Cygwin 已经不仅仅提供 POSIX 兼容,因此也顺带多了更多模拟层的依赖关系,一方面它的模拟层实现了相当良好的 Posix 兼容,一方面使得Cygwin越来越庞大,使得 Cygwin更像是一个基于 Posix在windows 下实现了一个 unix-like环境。

1998年 Colin Peters 创建了一个开源项目并撰写了最初的版本, 命名为 mingw32 (Minimalist GNU for W32), 后来为了避免暗示它仅限于生成32位二进制文件, 后面的 32 被去除,从而变成了MinGW。

Colin Peters首先为MSVCRT.DLL(Microsoft Visual C Runtime )库提供了一组头文件和一个导入库, 不过这些代码需要依赖和使用Cygwin的某些接口。

之后的 Jan-Jaap van der Heijden希望不再依赖于Cygwin库,而是仅仅使用本机的构建环境来构建应用程序,所以Jan-Jaap着手开发了binutils、GCC和make,并生成了第一个无需使用Cygwin即可生成本机代码的编译器、汇编器和链接器工具。Mumit Khan 后来接手了开发工作,向程序包添加了更多Windows特定的功能,包括Anders Norlander的Windows系统标头。

2000年,该项目移至SourceForge,以寻求社区的更多帮助并集中开发。 在 SourceForge 上得到了更多开源人士的帮助, MinGW也得到很大的发展,甚至2005年9月MinGW被选为SourceForge的月度最佳项目。不过在与SourceForge对其邮件列表的管理存在分歧之后,2018年,MinGW迁移到OSDN。

相对于Cygwin,它首要特点就是简单性和性能好,因此,它不提供某些不能使用Windows API轻松实现的POSIX API,基于MinGW的程序是通过直接调用Windows API编译的。

  

** 安装方法

1. 在下安装 mingw-get-setup.exe 

 MinGW官方网址:http://www.mingw.org/


2. 下载与本地系统对应的离线包

 

sourceforge --  https://sourceforge.net/projects/mingw

** 关于一些细节的区分


1. MinGW 与 MinGW-W64
   mingw 只支持 x86, MinGW-W64 architecture 版本分为 x86_64 和 x86 版本
2. posix 与 win32
   Threads 由于在Windows NT家族内核和许多Unix内核中,线程管理和调度之间存在巨大差异,     Win32 使用实际的系统调用来处理线程,而 posix使用 pthreads,总之推荐使用 posix。
3. sjlj, dwarf and seh

sjlj (setjmp/longjmp):
available for 32 bit and 64 bit
not "zero-cost": even if an exception isn't thrown, it incurs a minor performance penalty (~15% in exception heavy code) but sometimes the penalty can be more significant: [QTBUG-29653] Significant performance regression in Qt 5.0.1 compiled with MinGW - Qt Bug Tracker
allows exceptions to traverse through e.g. windows callbacks

DWARF (DW2, dwarf-2)
available for 32 bit only
no permanent runtime overhead
needs whole call stack to be dwarf-enabled, which means exceptions cannot be thrown over e.g. Windows system DLLs.

SEH (zero overhead exception)
will be available for 64-bit GCC 4.8.
rubenvb release is available targetting Win64/Personal Builds/rubenvb/gcc-4.8-release/x86_64-w64-mingw32-gcc-4.8.0-win64_rubenvb.7z/download
MinGW-builds release is available

综上,sjlj 是 C标准库就有的东西,seh 在 2014 年前是有专利的,从性能上说 seh 比 sjlj 快。
推荐, x86 => dwarf, x86_64 => seh

** extends libraries

--with-gmp=/c/mingw810/prerequisites/i686-w64-mingw32-static
———— mingw32-gmp 可选,GNU 多精度运算库。
———— mingw32-libgmp 可选,GMP 库的 DLL 文件。
———— mingw32-libgmpxx 可选,GMP 库用于 C++ 的 DLL 文件。

--with-mpfr=/c/mingw810/prerequisites/i686-w64-mingw32-static
———— mingw32-mpfr 可选,MPFR 多精度运算库。
———— mingw32-libmpfr 可选,MPFR 多精度浮点运算库的 DLL 文件。

--with-mpc=/c/mingw810/prerequisites/i686-w64-mingw32-static
———— mingw32-mpc 可选,MPC 多精度运算库。
———— mingw32-libmpc 可选,MPC 多精度浮点运算库的 DLL 文件。

--with-isl=/c/mingw810/prerequisites/i686-w64-mingw32-static
———— Library for manipulating sets and relations of integer points bounded by linear constraints

--with-libiconv
———— mingw32-libiconv 可选,字符集转换库。

** 此致

最后写点为什么吧,为什么一定要用 mingw,其实并不是说 msvc不够好,应该就是为了 free 吧
封装太好的东西,往往并不是很完美的,但是也不是开源一定够好,最后只能说喜欢就好了,一次 linux 终生那叫一个折腾吧
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值