专栏首页用户2442861的专栏MinGw与Cygwin的区别

MinGw与Cygwin的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/details/53322573

一、GCC的一般介绍

GCC是一个原本用于Unix-like系统下编程的编译器。不过,现在GCC也有了许多Win32下的移植版本。

GCC是GNU公社的一个项目。是一个用于编程开发的自由编译器。

最初,GCC只是一个C语言编译器,他是GNU C Compiler 的英文缩写。

随着众多自由开发者的加入和GCC自身的发展,如今的GCC以经是一个包含众多语言的编译器了。

其中包括 C,C++,Ada,Object C和Java等。所以,GCC也由原来的GNU C Compiler变为GNU Compiler Collection。

也就是 GNU编译器家族 的意思。当然,如今的GCC借助于他的特性,具有了交叉编译器的功能,即在一个平台下编译另一个平台的代码。

二、Windows下的GCC家族

起初,GCC是用于Unix,Unix-like系统的编译器。不过,现在Windows下也出现了GCC的稳定移植版。

如今,在Windows下比较流行的GCC移植版主要有三个。他们是 MinGW,Cygwin和Djgpp。

虽然,Djgpp是应用于DOS系统的,考虑到windows对DOS的兼容,所以也将Djgpp纳入其中了。

总体来说,MinGW,Cygwin和Djgpp各有特色,针对不同的应用场合,可以选择不同的移植版来满足需要。

MinGW 的主要方向是让GCC的Windows移植版能使用Win32API来编程。 Cygwin 的目标是能让Unix-like下的程序代码在Windows下直接被编译。 Djgpp 则是想让DOS下也能用上GCC。

所以,对于开发人员不同的需求。选择合适的移植版会让工作变得轻松而高效

MinGW

Minimalistic GNU for Windows。 她是一个建立在GCC和binutils 项目上的编译器系统。和其他GCC的移植版相比,她可以说是最接近Win32的一个了。 因为,MinGW几乎支持所有的Win32API,这也是MinGW的特色之一。 她所连接的程序,不需要任何第三方库就可以运行了。 在某种程度上看,MinGW更像是VC的替代品。

MinGW 官方网站为 http://www.mingw.org 实际上 MinGW 并不是一个 C/C++ 编译器,而是一套 GNU 工具集合。除开 GCC (GNU 编译器集合) 以外,MinGW 还包含有一些其他的 GNU 程序开发工具 (比如 gawk bison 等等)。 开发 MinGW 是为了那些不喜欢工作在 Linux(FreeBSD) 操作系统而留在 Windows 的人(比如我)提供一套符合 GNU 的 GNU 工作环境。

GCC 就是 MinGW 的核心所在,GCC 是一套支持众多计算机程序语言的编译系统,而且在语言标准的实现上是最接近于标准的。并且 GCC 几乎可以移植到目前所有可用的计算机平台。

Cygwin

其实并不是一个GCC。她是让Windows拥有Unix-like环境的软件。 所以,GCC自然也就会包含在里面。 不过,对于开发者,Cygwin是一个开发环境。而对于用户来说Cygwin是一个运行环境。 Cygwin唯一和MinGW最大的区别在于,使用Cygwin可以在Windows下调用Unix-like的系统函数。 比如进程函数,等等。所以,虽然说,Cygwin是运行在Windows下的,但是她还是使用的是Unix-like系统的函数和思想。

MSYS

Unix-like command line utilities 包括基本的bash, make, gawk and grep 等等。通常也可以认为是小型的UNIX on Windows。提供在windows上模拟Unix环境来使用MinGW。 msys-cn :http://code.google.com/p/msys-cn/MSYS 中国发行版,用UNIX开发环境开发Windows程序。 MSYS在windows下模拟了一个类unix的终端,它只提供了MinGW的用户载入环境,在MSYS模拟的unix环境下使用MinGW,就像在Unix使用gcc一样。

MSys(Minimal SYStem)的子项目,主要是提供了一个模拟Linux的Shell和一些基本的Linux工具。因为编译一个大型程序,光靠一个GCC是不够的,还需要有Autoconf等工具来配置项目,所以一般在Windows下编译ffmpeg等Linux下的大型项目都是通过Msys来完成的,当然Msys只是一个辅助环境,根本的工作还是MingW来做的

1、从目标上说

  • MinGW 是让Windows 用户可以用上GNU 工具,比如GCC。
  • Cygwin 提供完整的类Unix 环境,Windows 用户不仅可以使用GNU 工具,理论上Linux 上的程序只要用Cygwin 重新编译,就可以在Windows 上运行。

2、从能力上说

  • 如果程序只用到C/C++ 标准库,可以用MinGW 或Cygwin 编译。
  • 如果程序还用到了POSIX API,则只能用Cygwin 编译。

3、从依赖上说

  • 程序经MinGW 编译后可以直接在Windows 上面运行。
  • 程序经Cygwin 编译后运行,需要依赖安装时附带的cygwin1.dll。

Cygwin是用一个dll模拟linux环境来“欺骗”应用程序,好像自己运行在linux环境下;而mingw是在编译时提供linux到windows必要代码的“翻译”转换,用到的还是windows运行时库。 在cygwin下编译出来的程序需要cygwin.dll才能在windows下运行,源码拿到linux环境下重新编译就可以在linux下跑起来;mingw环境下编译出来的程序,只能在windows下跑,源码在linux环境下编译多半通不过。

   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是很好的一个选择。

cygwin 和 mingw区别

说一点,什么cygwin编译的程序可以无缝在linux上运行,根本就不能这么理解。 cygwin官方的一个定义是Cygwin is not a way to run native linux apps on Windows. You have to rebuild your application from source if you want it to run on Windows. 翻译过来就是 cygwin不是让linux程序能在windows上运行的方法,如果你想要让linux程序能在windows运行,那么你只有用cygwin来重新编译一下源文件。 这句话完全反驳了无缝运行在linux的说法。就是说你在linux上编译的elf程序不能直接拿到cygwin上运行,同样,你用cygwin编译的程序也不是linux的elf格式,而是exe格式,exe是无法在linux上运行的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python-OpenCV 处理图像(三):图像像素点操作

    第一种办法就是将一张图片看成一个多维的list,例如对于一张图片im,想要操作第四行第四列的像素点就直接 im[3,3] 就可以获取到这个点的RGB值。

    bear_fish
  • 白话经典算法系列之六 快速排序 快速搞定

    原文   http://blog.csdn.net/morewindows/article/details/6684558

    bear_fish
  • python中的多态

    允许父类指针或名称来引用子类对象,或对象方法,而实际调用的方法为对象的类类型方法。

    bear_fish
  • Android版-微信APP支付

    服务端源码地址:http://git.oschina.net/javen205/weixin_guide 客户端源码地址:https://github.com...

    Javen
  • OpenCV中的透视变换介绍

    透视变换原理 透视变换是将图像从一个视平面投影到另外一个视平面的过程,所以透视变换也被称为投影映射(Projection Mapping)。我们知道在图像的仿射...

    OpenCV学堂
  • 在Debian中打造属于自己的deb包

    问题:如果你要在Debian系统中发布一款软件或者一个包,该如何做呢?如果你的项目中有各种二进制包,该如何维护呢?如果你自己做了一款小小的实用软件,该如何与朋友...

    ternturing
  • 渗透实战之QQ空间钓鱼网站

    然后发现地址栏域名和垃圾邮箱里面的给的链接的域名不一样, 是跳转过去的,遂访问初始的域名。

    HACK学习
  • Java基础系列之日期时间处理

     Java在处理时间方面提供了很多的API供我们开发使用。例如:Date,Calendar,SimpleDateFormat等等之类的。下面看例子Demo的实现...

    林老师带你学编程
  • Python全栈开发之Django进阶

    项目中CSS、JS、图片都属于静态文件,一般会将静态文件存到一个单独目录中,便于管理,在HTML页面调用时,需要指定静态文件的路径,Django提供了一种解析静...

    py3study
  • LeetCode45,初看是搜索,苦思冥想原来是贪心

    今天是LeetCode系列的第25篇文章,今天我们一起来看的是LeetCode的第45题,Jump Game II。

    TechFlow-承志

扫码关注云+社区

领取腾讯云代金券