大屏前端框架如何推动企业数据可视化与用户体验的革新
1609
2022-09-23
minGW, cygwin, GnuWin32【C++的跨平台交叉编译问题】
这几天在整C++的跨平台交叉编译问题,总算告一段落,把具体涉及的内容整理如下:
首先,三个的官方网站分别是: minGW:cygwin: gnuwin32: minGW给那些习惯于在Linux上开发的人员,在windows上提供了一套类似的工具集。 cygwin主要是对于再Linux的程序,无需改动代码即可移植到windows上 gnuwin32主要是对习惯linux工具的人员,在windows上提供一套类似的命令。
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的实现思路和设计思想是不同的:
不过上面的结论不是绝对的,比如:
当你使用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了。
MinGW 是 GCC 編譯器的 Win32 精簡移植版,理論上 MinGW 可以將標準的 C/C++/Fortran/... 原始碼編譯成 Win32 原生程式,但實務上光移植編譯器仍然有所不足,因為很多現存的軟體只有針對 Unix-like 環境撰寫 Makefile 或 autotools 配置檔,因此有必要將建置軟體過程最常用到的 Linux 功能也一併模擬,這就是 MSYS 的由來。
MSYS 純粹就只是為了編譯程式開一條方便之門,僅提供了少許的 Linux 工具,並且模擬 Linux 的命令解釋器和目錄架構。這和 MinGW 之前的 Cygwin 有很大的不同,Cygwin 的目標是在 Windows 上盡可能完整地模擬 Linux。事實上 Cygwin 在很多場合被視為既非 Windows 亦非 Linux 的獨立 target 平台。
http://stackoverflow.com/questions/771756/what-is-the-difference-between-cygwin-and-mingw
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~