Chinaunix首页 | 论坛 | 博客
  • 博客访问: 382986
  • 博文数量: 48
  • 博客积分: 743
  • 博客等级: 上士
  • 技术积分: 956
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-22 13:51
文章分类

全部博文(48)

文章存档

2015年(3)

2014年(17)

2012年(23)

2011年(5)

分类: C/C++

2012-04-19 22:52:47

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的做法.

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由RedHat维护和支持。在版权上,由于Cygwin不是一个软件,而是由成百上千的软件堆砌起来的系统,里面有商业软件的成分/概念,所以它的许可证有开源性质的(GPL)和商业性质的(从RedHat购买)两种。

MinGW

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

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

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

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

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

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的-mthreads选项(和线程安全异常处理有关)时,就会动态链接到 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还有很多不足:

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

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

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

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

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

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

注意:

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

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

获取最新mingw.一个make就搞定:

一般只要make gcc就OK了。
阅读(5268) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~