windows下的GNU编译环境Cygwin和MinGW

一般我们开发windows下的程序都是使用VC,VS这样的可视集成化的IDE,但是有很多开源软件例如mplayer,vlc等为了保持程序的跨平台性,通常都会选择使用GUN标准进行开发,linux环境下GUU编译工具一般都是gcc,g++等。而到了windows平台上,我们也可以选择Cygwin或者Msys+MingW等编译器进行开发。下面是特酷吧在学习中整理的资料。

Cygwin

Cygwin是一些自由软件的集合,所谓的Cygwin的官方解释是:GUN + Cygnus + windows = cygwin。Cygnus最初的时候是把gcc,gdb等这些linux平台下的编译调试等工具进行改造,使他们能够配合生成win32格式的目标文件。为了节省开发工作,他们编写了一个共享库cygwin.dll,这个库里集成了win32.api中没有的unix风格的调用,也就是编写了一个unix系统的模拟层。Cygwin包含了一套库,该库允许在win32环境中实现POSIX系统调用的API并有一套GUN开发工具集。它由两部分组成。一个是核心的cygwin1.dll,这个dll以windows的api实现了Linux下的大部分API。另一个部分则是newlib,实际上就是glibc,它将调用cygwin1.dll中的实现,然后以glibc的形式呈现给用户使用。它但一个很大的缺点是Cygwin不支持Unicode。Cygwin的安装非常简单,到http://www.cygwin.com/下载安装文件,直接在windows下安装即可。配置好环境之后,就可以和linux一样在终端界面使用Cygwin了。

MingW+Msys

该组合在网络上评价很高,特酷吧查询到的结果是,很多人都认为Msys+MingW比Cygwin小巧且效率高。特酷吧认为Msys+MingW是早些年的说法,现在只要安装MingW,再安装软件的时候就会让你选择是否需要安装Msys,如果选中的话,则Msys会继承到MingW中,安装完成以后在mingW shell中就可以编译程序,类似liunx的终端。

Msys的全称是“Minimal GNU(POSIX)system on Windows”,是一个小型的GNU环境,包括基本的bash,make等等。是Windows下最优秀的GNU环境,特酷吧认为他就是模拟linux系统的一个集成环境包,当然不具备编译功能,编译功能由MingW实现。

MingW,即 Minimalist GNU For Windows。它是一些头文件和库的集合,该集合允许人们在没有第三方动态链接库的情况下使用GCC产生 Windows32程序。开发MinGW是为了那些不喜欢工作在 Linux(FreeBSD) 操作系统而留在 Windows 的人提供一套符合GNU的GNU工作环境(据说Cygwin是有版权的)。

Msys+MingGW他们结合就组成了一个在windows下的类似linux系统的终端环境,在该环境下可以使用一些linux命令,还可以编译程序。

工程地址:http://www.mingw.org/

MingW的安装配置

http://sourceforge.net/projects/mingw/files/latest/download下载类似mingw-get-inst-20120426的文件,点击安装则会选择要安装的编译器以及Msys系统数据库(已经集成了MingW),一般做c/c++开发需要选中C Compiler、C++ Compiler、MSYS Basic System ,选上之后,安装程序会他通过网络安装好所有需要的文件,很方便。

安装完成之后,最好设置一下环境变量:

我的电脑属性,选择“高级”选项卡。点击“环境变量”按钮。

点击“新建(W)”,新建环境变量:MINGW_HOME,变量值为你刚才安装MinGW的安装目录。

选择环境变量Path,点击“编辑"。在尾部加入“;%MINGW_HOME%\bin”。

完成之后再cmd下输入gcc -v和g++ -v如果出现mingw的版本信息则说明安装成功,以后我们就可以使用mingW shell进行类似linux下的编译操作。

对于这两个软件特酷吧常用的就是MingW。

MingW和Cygwin的区别:

可以参考:http://hi.baidu.com/ooxxer/item/d25dccc072846a50ac00ef7e  特酷吧在此引用如下:

(1)首先明确的是MingW和cygwin都可以用来跨平台开发。 

MinGW是Minimalistic GNU for Windows的缩写,也就是Win版的GCC[只是一个编译工具,Msys是对MinGW的辅助]。 

Cygwin则是全面模拟了Linux的接口,提供给运行在它上面的的程序使用,并提供了大量现成的软件,更像是一个平台。 

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

(2)用MingW和cygwin编译出来的程序的区别 

首先MingW和cygwin都不能让Linux下的程序直接运行在Windows上,必需通过源代码重新编译。 

现代操作系统包括Windows和Linux的基本设计概念像进程线程地址空间虚拟内存这些都是大同小异的,之所以二者上的程序不能兼容,主要是它们对这些功能具体实现上的差异,首先是可执行文件的格式,Window使用PE的格式,并且要求以.EXE为后缀名。Linux则使用Elf。其次操作系统的API也不一样,如Windows用CreateProcess()创建进程,而Linux使用fork()。  所以要移植程序必然要在这些地方进行改变,MingW有专门的W32api头文件,来把代码中Linux方式的系统调用替换为对应的Windows方式。而Cygwin则通过cygwin1.dll这个文件来实现这种API的转换,并模拟一个Linux系统调用接口给程序,程序依然以Linux的方式调用系统API,只不过这个API在cygwin1.dll上,cygwin1.dll再调用Windows对应的实现,来把结果返回给程序。  可以用查看他们编译好的程序的导入表来验证这点。 

二者生成的程序都是能在Windows上运行的EXE文件,显然都是PE格式,用一个PE格式查看工具检查一下就能发现,Cygwin生成的程序依然有fork()这样的Linux系统调用,但目标库是cygwin1。而MingW生成的程序,则全部使用从KERNEL32导出的标准Windows系统API。 

这样看来用Mingw编译的程序性能会高一点,而且也不用带着那个接近两兆的cygwin1.dll文件。  但Cygwin对Linux的模拟比较完整,甚至有一个Cygwin X的项目,可以直接用Cygwin跑X。 

另外Cygwin可以设置-mno-cygwin的flag,来使用Mingw编译。  而与Cygwin更有可比性的MSys上的工具也是通过Cygwin这种模拟的方式来提供的。 

总之这两个项目有千丝万缕的关系,一个不恰当的比方,如果Mingw是MFC,Cygwin就是.NET了。

简单的说来:

1.修改编译器,让window下的编译器把诸如fork的调用翻译成等价的形式--这就是mingw的做法.

2.修改库,让window提供一个类似unix提供的库,他们对程序的接口如同unix一样,而这些库,当然是由win32的API实现的--这就是cygwin的做法

posted @ 2013-05-26 16:26  坏混混  阅读(4422)  评论(1编辑  收藏  举报