2008.12.23补记:我对mingw的了解确实不多,本文是我(liigo)“对mingw的初步印象和感性认识”(而非“对mingw的盖棺定论式的评价”),文中有错误之处在所难免,敬请批评指正;如果有读者受我误导,深表歉意。不想因为此文浪费某些读者的宝贵时间,特此说明。
这几天试用wxWidgets,分别用VC6和MinGW5编译通过,下面是一些记录。
MinGW:根据我的理解,它是一个Windows下的编译器(实际上是一系列开发工具)。与Windows下其它编译器不同的是,MinGW与Linux下广泛使用的GNU(基本上)完全兼容,这意味着,在Linux下如何编译源代码,在MinGW中也可以以完全相同的方式编译。
我个人以为,MinGW的出现是有原因的:有些Linux下的开发人员(比如开源阵营)发布的源代码通常只提供Linux下的编译方式,而不提供Windows下的编译方式(这可能与其不熟悉windows操作系统有关),但确实有不少用户需要在在Windows下编译使用此源代码。这在种情况下,如果Windows用户想用VC、BC等编译器编译该源代码,必须重写Makefile(各种编译器所支持的Makefile不尽相同),工作量比较大不说,还很难保证不出错。MinGW的出现,提供了两个平台下的“跨平台编译方案”。MinGW与MSYS相配合,连./configure都有了。与GNU不同的是,MinGW编译生成的是Windows下的可执行文件(.exe)或库文件(.dll,.lib)——不过编译过程中的的中间文件仍然是.o文件,而不是.obj文件(这当然无所谓了,中间文件嘛,编译完成后就没有用了)。MinGW好像是在Cygwin基础上发展而来的。顺便说一下Cygwin,它与MinGW在想法上基本是一致的,两者相比,Cygwin是重量级的(需下载50M以上直至数百兆不等,安装后占用空间可达1G),MinGW是轻量级的(需下载的文件只有20M,安装后70M左右),这是单纯从体积上说的,另外Cygwin现在据说也不是完全免费的了。
wxWidgets-2.6.2在Windows下的编译方式。用VC编译的话,有两种方式:VC工程,Makefile。前者就不用说了,用VC打开*.dsw文件,F7就可以了。这里说一下Makefile的编译方式,首先进入命令行窗口(cmd.exe 或 command.exe),切换路径到wxWidgets源代码所在目录下的 build/msw 子目录,执行“nmake -f makefile.vc”即可。用MinGW编译的话,基本上与前面类似,也是进入命令行窗口(cmd.exe 或 command.exe),切换路径到wxWidgets源代码所在目录下的 build/msw 子目录,只是执行的命令行是“mingw32-make -f makefile.gcc”。最终生成的库文件位于lib目录中。当然,编译之前可能需要设置一下,比如指定编译为动态库(DLL)还是静态库(LIB),或者是否采用UNICODE,等等,设置方式就是修改 build/msw 子目录中的 config.vc 或 config.gcc 文件。
VC6和MinGW相比,两者在编译速度,以及在编译后的文件的大小方面都有较大不同。根据我编译wxWidgets时所做的简单统计,VC6的编译速度比MinGW至少快一倍,VC6编译生成的动态库DLL文件比MinGW小一倍左右,VC6编译生成的静态库LIB文件比MinGW要大不少(大约是1.5倍)。下面的图片两者编译生成的文件大小的对比,左侧是VC6生成的,右侧是MinGW生成的,图一是编译生成动态库DLL的情况,图二是编译生成静态库LIB文件的情况:
总起来说,在Windows系统下,还是用VC编译比较合适,没办法的情况下才会选择MinGW。