一、 在Windows下比较流行的GCC移植版主要有三个。他们是 MinGW,Cygwin和Djgpp。
1.MinGW 的主要方向是让GCC的Windows移植版能使用Win32API来编程。
(使用Win32API的代码可用MinGW的gcc编译,有点像用Linux开发环境开发Windows程序 如果你只是想在windows下使用gcc编译器也不想依赖其他的dll,mingw是很好的一个选择。 )
2.Cygwin 的目标是能让Unix下的程序代码在Windows下直接被编译。
(模拟Linux环境,包括调用Linux下的函数,可以大概认为在Cygwin下运行的程序可以直接在Linux下运行,反之亦然)
3.Djgpp 则是想让DOS下也能用上GCC。
所以,对于开发人员不同的需求。选择合适的移植版会让工作变得轻松而高效。
二 、介绍
MinGW
Minimalistic GNU for Windows。
她是一个建立在GCC和binutils 项目上的编译器系统。和其他GCC的移植版相比,她可以说是最接近Win32的一个了。
因为,MinGW几乎支持所有的Win32API,这也是MinGW的特色之一。
她所连接的程序,不需要任何第三方库就可以运行了,允许人们在没有第三方动态链接库的情况下使用 GCC(GNU Compiler C)产生 Windows32 程序。
在某种程度上看,MinGW更像是VC的替代品。
实际上 MinGW 并不仅是一个 C/C++ 编译器,而是一套 GNU 工具集合。除开 GCC (GNU 编译器集合) 以外,MinGW 还包含有一些其他的 GNU 程序开发工具
Cygwin
其实并不是一个GCC。她是让Windows拥有Unix环境的软件, 可以直接编译unix下程序。
所以,GCC自然也就会包含在里面。
不过,对于开发者,Cygwin是一个开发环境。而对于用户来说Cygwin是一个运行环境。
Cygwin唯一和MinGW最大的区别在于,使用Cygwin可以在Windows下调用Unix的系统函数。
比如进程函数,等等。所以,虽然说,Cygwin是运行在Windows下的,但是她还是使用的是Unix系统的函数和思想。
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一样。
三 、cygwin和MinGW区别
cygwin和MinGW都是gcc在windows下的编译环境,但是它们有什么区别,在实际工作中如何选择这两种编译器。
cygwin下的gcc和linux下的gcc完全使用的是相同的Toolsets。所以完全可以和linux一起同步更新gcc版本,而不用担心问题,并且在cygwin做的东西(不用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是很好的一个选择。
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上运行的。
cygwin和mingw都是为用户提供在windows操作系统使用GNU工具的方法,使得在windows上可以编译为linux写的c源代码并运行(让你可以用signal等linux才有的api)。真正的不同在于
1,cygwin大,mingw小
2,cygwin编译后的exe需要cygwin1.dll作为支持,而mingw不需要就可以直接运行,因为有中间层所以cygwin慢,mingw快。
3,cygwin包含的内容更全面,能编译通过的linux源文件更多,mingw的min是minimalist所以能编译通过的更少。但,不是全部,就是说别指望你可以把任何为linux写的源代码在cygwin或mingw编译通过并运行。
mingw:
mingW只能编译使用Win32API的程序 ,如果需要编译linux 下的程序,最好用cygwin
比如mingw,无法编译这些linux 头文件的 netinet/in.h,arpa/inet.h,netinet/in.h,arpa/inet.h,#include <sys/ioctl.h>等等
不过也有cygwin不支持的Unix特性,比如pthread