ZY's WordPress ? Windows下搭建开发跨平台GUI程序环境:Cygwi...

来源:百度文库 编辑:神马文学网 时间:2024/04/20 10:54:14

Windows下搭建开发跨平台GUI程序环境:Cygwin、MinGW、Eclipse、wxWidgets

最近使用Eclipse搭建了一个开发跨平台GUI程序的环境,其实是将一些开发包、开发库拼在一起使用,它们相互之间没有什么紧密的联系,不过这样也保留了它们自有的特点。

下面首先说明一下这个开发环境中,几个组成部分的特点,这也表明了我为什么选择并组合使用它们的原因。随后在后续文章中逐步说明搭建这个环境的步骤。

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的实现思路和设计思想是不同的:

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

  2. 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还有很多不足:

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

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

最后我选择了下面这种方式搭建Windows下的Unix/Linux开发环境:

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

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

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

注意:

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

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

Eclipse

开源的IDE环境,本身用Java实现,但绝不是只能作为Java的IDE,它有着丰富的扩展,当使用CDT后,Eclipse就成为强大的C/C++ IDE。Eclipse-CDT的源程序符号检索功能很强大,是我见过的最准确、最方便的C/C++符号检索功能,比SourceInsight、VC内置的Intellisense、VC的Visual Assist X插件都强大,比Emacs的CEDET模式中的Semantic的配置更方便。无论多么复杂的C/C++语法和工程配置管理,Eclipse-CDT都可以为你生成“当前工程的当前配置项”下的源程序符号索引数据库,帮你可以方便的查看/编辑源代码。不像SourceInsight和Visual Assist X,它们在解析像MFC那种“宏套宏”的奇怪语法时,或者在工程依赖、多配置项等复杂配置管理下就力不从心了。当然,Eclipse-CDT这种准确的符号检索功能是以“花费更长时间来生成索引数据库”为代价的:我为wxWidgets-2.8.10库工程建立源程序索引就用了1分钟左右,建立的索引数据库文件(.pdom)大小在35MB以上。当你频繁的在一个大工程的多个配置项之间切换时,这种速度慢的感觉就会更明显。不过一般来说,花费时间来建立准确的源程序索引数据库是值得的。

wxWidgets

开源的C++支持库,GUI开发支持是其重点,但不局限于此:也包括很多基础性的功能支持,像字符串、locale机制、Socket等。wxWidgets库的架构风格很像微软的MFC,并且都是包罗万象型的类库,适合熟悉MFC的开发者转型。支撑wxWidgets的下层运行环境/库有多种选择:Windows API、GTK、Motif、MacOS、X11、MGL等,所以wxWidgets应用可以很容易的移植到多种系统平台上。只要有可能,wxWidgets总是优先使用本地平台/库的API来实现其自身界面,这样保证了界面绘制的效率,例如:在Windows下,wxWidgets和MFC相似,通过调用Windows API来绘制窗口。但wxWidgets也有一个wxUniversal版本,是自己绘制界面元素的。wxWidgets库也有其它语言的调用界面,例如:Python、Perl、Ruby等。

这里有一些wxWidgets的入门参考:

  • 官方Wiki中关于wxWidgets和其它库的对比:WxWidgets Compared To Other Toolkits
    FinderCheng对上面文章的中文翻译:部分1,部分2

  • 官方Wiki中对可用于wxWidgets应用开发的IDE列举:List of Integrated Development Environments

  • 官方Wiki中对可用于wxWidgets应用开发的工具介绍:Tools