博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MinGW与Cygwin
阅读量:4028 次
发布时间:2019-05-24

本文共 5695 字,大约阅读时间需要 18 分钟。

转自:
 
一 MinGW
        MinGW 官方网站为        
        MinGW,即 Minimalist GNU For Windows(GCC compiler suite)。它是一些头文件和端口库的集合,该集合允许人们在没有第三方动态链接库的情况下使用 GCC(GNU Compiler C)产生 Windows32 程序。
 
        MinGW:一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,在基本层,MinGW 是一组包含文件和端口库,其功能是允许控制台模式的程序使用微软的标准C运行时间库(MSVCRT.DLL),该库在所有的 NT OS 上有效,在所有的 Windows 95 发行版以上的 Windows OS 有效,使用基本运行时,你可以使用 GCC 写控制台模式的符合美国标准化组织(ANSI)程序,可以使用微软提供的 C 运行时扩展。该功能是 Windows32 API 不具备的。下一个组成部分是 w32api 包,它是一组可以使用 Windows32 API 的包含文件和端口库。与基本运行时相结合,就可以有充分的权利既使用 CRT(C Runtime)又使用 Windows32 API 功能。
 
       实际上 MinGW 并不仅是一个 C/C++ 编译器,而是一套 GNU 工具集合。除开 GCC (GNU 编译器集合) 以外,MinGW 还包含有一些其他的 GNU 程序开发工具 (比如 gawk bison 等等)。
 
       开发 MinGW 是为了那些不喜欢工作在 Linux(FreeBSD) 操作系统而留在 Windows 的人提供一套符合 GNU 的 GNU 工作环境。所以,使用 MinGW 我们就可以像在 Linux 下一样使用 GNU 程序开发工具。
 
      GCC 就是 MinGW 的核心所在,GCC 是一套支持众多计算机程序语言的编译系统,而且在语言标准的实现上是最接近于标准的。并且 GCC 几乎可以移植到目前所有可用的计算机平台。
 
      GCC 本身不像VC那样拥有IDE界面(但是有很多的开源的IDE支持使用MinGW,例如codeblocks,eclipse等)。源代码编辑你可以选用任何你喜欢的文本编辑器(据说微软的开发人员包括 VC 的开发都不用 VC 所带的 IDE 编辑器,而是选用 GNU 的 VIM 编辑器)。然后使用 make 等工具来进行软件项目的编译、链接、打包乃至发布。而像 cvs(svn) 源代码版本控制工具可以让世界上任何一个角落的人都可以参与到软件项目中来。
 
  关于 MFC,微软基础库类,这个随 VC++ 携带的一个源代码公开的开发包,和其他 Windows 程序开发包是一样的。如果有 VC++ 的授权,你完全可以使用 MFC 的源代码,也就是你使用 GCC 来编译 MFC 程序是完全可以的。
 
  当然,GNU 下也有很多 Windows 程序开发包,甚至有一些是支持跨平台使用的。不仅仅可以直接把源代码编译为 Windows 程序,也可以不经修改编译为其他操作系统的图形程序。
 
二 MSYS 
       官方网站为   
       MSYS:Unix-like command line utilities,包括基本的bash, make, gawk and grep 等等。通常也可以认为是小型的UNIX on Windows。提供在windows上模拟Unix环境来使用MinGW。
 
         :
        。
 
       MSYS在windows下模拟了一个类unix的终端,它只提供了MinGW的用户载入环境,在MSYS模拟的unix环境下使用MinGW,就像在Unix使用gcc一样。
 
三 cygwin/gcc
       cygwin/gcc和MinGW都是gcc在windows下的编译环境,但是它们有什么区别,在实际工作中如何选择这两种编译器。
 
       cygwin/gcc完全可以和在linux下的gcc化做等号,这个可以从boost库的划分中可以看出来端倪,cygwin下的gcc和linux下的gcc完全使用的是相同的Toolsets。所以完全可以和linux一起同步更新gcc版本,而不用担心问题,并且在cygwin/gcc做的东西(不用win32的)可以无缝的用在linux下,没有任何问题。是在windows下开发linux程序的一个很好的选择。
 
       但是在cygwin/gcc下编译出来的程序,在windows执行必须依赖cygwin1.dll,并且速度有些慢,如果不想依赖这个东西的化,必须在gcc的编译选项中加入-mno-cygwin。加入这个选项其实gcc编译器就会自动的选择在安装cygwin/gcc时安上的mingw,这个mingw就是gcc的一个交叉编译。
 
      对于mingw作为gcc在windows上的一个实现,由于不像cygwin的gcc在一个模拟linux上运行,同时相当一部分linux的工具不能够使用,不过现在已经有Msys这个模拟unix的shell,可以解决很多的问题。
 
四 总结
      MinGW是windows版本的gcc集合,不需要依赖中间层。
      MSYS是小型的linux的环境的模拟,可以与MinGW结合来模拟linux环境下使用MinGW的gcc。
      Cygwin是功能强大的linux环境,由于有cygwin1.dll实现了底层的windows api到linux api的转化。所以在Cygwin里开发就相当于在linux上开发,对于开发人员来说就相当于调用linux类型的api,所以这样开发的程序也可以直接移植到linux上。但是如果这样的程序要在windows上执行的话,运行时必须要cygwin1.dll支持。
 
      根据以上的分析,如果在windows开发linux跨平台的程序,linux模拟器Cygwin以及所包含的gcc是很好的选择,但是开发的程序必须依赖一个cygwin1.dll。如果你只是想在windows下使用gcc编译器也不想依赖其他的dll,mingw是很好的一个选择。
 
完!

感谢,Thanks!

===============================================================================================

转载自 
最终编辑 
Unix下编译通过的C代码,在win32下编译是不能通过的 ,当然Unix 和win32的API都是符合标准C,也就是说,大多数函数调用在unix和win32下是相同的.但是,unix有自己一些独特的API(如fork,spawn,signals,select,sockets等),如果代码中使用了这些API,在win32下当然找不到对应的库.
但是,这些API的功能在win32中也能实现,也许你已经发现了一个能让window编译Unix风格代码的方法:
1.修改编译器,让window下的编译器把诸如fork的调用翻译成等价的形式--这就是mingw的做法.
2.修改库,让window提供一个类似unix提供的库,他们对程序的接口如同unix一样,而这些库,当然是由win32的API实现的--这就是cygwin的做法.

这个项目的名字来源于:GNU、Cygnus、Windows,3者的缩写。Cygwin的目标是:构建一套Windows下的Linux模拟环境。因此,Cygwin是一个庞大的项目,不只包括Linux下的开发环境,也包括工作环境,和各种各样的Linux下的软件。

在早期,Cygwin的核心是cygwin1.dll,可以认为它是一个POSIX界面的实现,依靠这个动态链接库,Unix/Linux下的软件 可以很容易的移植到Windows下,并且风格保持原有的不变。不过随着Cygwin的发展,越来越多的Unix/Linux程序的移植,建立基于 Cygwin的复杂程序依赖的库也越来越多,现在装完默认配置的Cygwin后,就会发现有很多cyg打头的动态链接库。

目前Cygwin由维护和支持。在版权上,由于Cygwin不是一个软件,而是由成百上千的软件堆砌起来的系统,里面有商业软件的成分/概念,所以它的许可证有开源性质的(GPL)和商业性质的()两种。

这个项目的名字来源于:Minimalist GNU for Windows的缩写。

最初,MinGW的目标定位为:Windows下的开源的开发环境。它包括一系列软件:编译工具、链接工具、转储工具、调试工具、和其它开发工具等。另一方面,MinGW还提供一些开源的基础支持库,像GNU的C/C++ RT库(),POSIX的基本调用界面(包括pthread),甚至还有OpenGL和Windows API的调用接口等。几乎所有MinGW中的软件都是从GNU项目或Linux下移植到Windows下的。

后来MinGW有了一个子项目叫:,其中包括了更多的Linux工具,其目标类似Cygwin:构建一套Windows下的Linux模拟环境。

总之,MinGW中的东西很杂,和Cygwin之间有相当一部分是重复的(目前,Cygwin项目中已经集成MinGW了)。但MinGW和Cygwin的实现思路和设计思想是不同的:

  1. Cygwin通过一个中间层的动态链接库,将位于下层的Windows API,和位于上层的使用POSIX界面的应用连接起来,好处是应用在Linux与Windows之间移植更加方便,风格更加一致;缺点是发布应用时一定 要带上Cygwin的环境动态库,应用执行效率也略微有点低。

  2. MinGW在基础支持库层次,使用静态链接的方式,这样生成的应用更加地本地化,应用执行效率也稍高一些。所以MinGW声明:基于MinGW开发的应用,不需要依赖任何第三方的C/C++ RT动态链接库,仅依赖Windows自身的运行环境:

    MinGW provides a complete Open Source programming tool set which is suitable for the development of native MS-Windows applications, and which do not depend on any 3rd-party C-Runtime DLLs.

不过上面的结论不是绝对的,比如:

  • 当你使用MinGW GCC的选项(和线程安全异常处理有关)时,就会动态链接到 mingwm10.dll。

  • 还有如果你使用MinGW GCC 4.4.0默认选项编译C++程序,就会动态链接到libgcc_s_dw2-1.dll,参考

    Dynamic linking with libgcc_s_dw2-1.dll is necessary to throw exceptions between different modules, such as between two DLLs or a DLL and an EXE. Consequently, it is the default for all languages other than C. To disable this dynamic linking, use -static-libgcc. To enable this dynamic linking in C, use -shared-libgcc.

MinGW的POSIX界面远没有Cygwin实现的那么全面(比如:连BSD/Linux Socket都没有,只能用Winsock),所以看起来MinGW只是用来开发Windows专属应用的工具集。

在版权上,MinGW比Cygwin更开放些。

我用过MSYS和Cygwin之后,发现MSYS相比Cygwin还有很多不足:

  1. MSYS中的工具更像是Unix/Linux下的工具在Windows下的移植版,其中有些工具可以支持Windows的一些特征(比如:目录分隔 用"\"),而有些并没有Unix/Linux下原始的版本那么好用(比如:bash、sed等)。而Cygwin是努力在Windows下构建一套完全 参照Unix/Linux体验的环境。

  2. MSYS中的工具很杂,和MinGW中的工具交织在一起(有时,开发工具和实用程序的界限并不是很截然,况且经常要配合使用),组织很松散,还有一 些爱好者自己提供软件包。如此,搭建基于MSYS的Unix/Linux环境变得稍繁琐,你需要更加谨慎地考虑软件包的依赖关系。而使用Cygwin就方 便多了,它的安装程序会归类显示软件包的组织关系,还能一定程度上帮你解决软件包的依赖关系。

推荐以下面这种方式搭建Windows下的Unix/Linux开发环境:

  1. 使用Cygwin的Unix/Linux工作环境,比如:bash、tar、awk、sed、od、man等。

  2. 使用MinGW的C/C++开发工具,比如:binutils、gcc、gdb、make、strip等;使用MinGW的基础支持库,比如:GNU的libc、libstdc++、POSIX的基本调用界面等。

  3. 根据需要,使用额外的支持/开发库,比如:pthread、openssl、libiconv、gettext、boost、wxWidgets等。

注意:

  1. 有些支持/开发库可以在找到,像pthread(mingw gcc-4.4中包含)、openssl、libiconv、gettext等。也可以从这些库官方的项目地址,或其它的Windows移植版项目地址下载,总之,它们之间的联系比较松散。

  2. 如果有一些程序,在MinGW和Cygwin安装后有重复,可以用各种技巧设定它们被选择的优先级,比如:设置PATH环境变量中的搜索目录顺序,建立符号链接等方法。

  3. 获取最新mingw.一个make就搞定:
    一般只要make gcc就OK了。

你可能感兴趣的文章
企业级监控管理平台建设密谈
查看>>
新基建
查看>>
Google SRE Four Golden Signals
查看>>
统一智能运维管理平台
查看>>
任正非告别荣耀讲话—-陌生的感动
查看>>
什么是POC
查看>>
标记一下
查看>>
一个ahk小函数, 实现版本号的比较
查看>>
IP报文格式学习笔记
查看>>
autohotkey快捷键显示隐藏文件和文件扩展名
查看>>
Linux中的进程
查看>>
学习笔记4——猜数字游戏,随机数
查看>>
学习python(1)——环境与常识
查看>>
学习设计模式(3)——单例模式和类的成员函数中的静态变量的作用域
查看>>
学习设计模式(5)——装饰器模式
查看>>
学习设计模式(6)——建造者模式
查看>>
rep movsd ,N - move all of our dwords--【解决办法】
查看>>
查找连续相同值的算法,并给出连续相同值的个数以及位置
查看>>
关于STL中的Vector,list和deque
查看>>
错误:常量中有换行符
查看>>