MinGW与Cygwin

MinGW与Cygwin

 

MingW和cygwin的区别

————————————————————-

首先MingW和cygwin都可以用来跨平台开发。 
MinGW是Minimalistic GNU for Windows的缩写,也就是Win版的GCC。  
Cygwin则是全面模拟了Linux的接口,提供给运行在它上面的的程序使用,并提供了大量现成的软件,更像是一个平台。  

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

用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这种模拟的方式来提供的。  

区别总结:

1.修改编译器,让window下的编译器把诸如fork的调用翻译成等价的形式–这就是mingw的做法. 
2.修改库,让window提供一个类似unix提供的库,他们对程序的接口如同unix一样,而这些库,当然是由win32的API实现的–这就是cygwin的做法.

 

 

 

如何选择MingW和cygwin

————————————————————-

如果在windows开发linux程序,cygwin是很好的选择。如果你开发的程序不介意有一个cygwin1.dll的话,也是可以选择cygwin的。

如果你是想开发windows下的程序,还要必须用gcc的话,mingw是很好的一个选择。

但是在windows下有太多的编译器了,bc,vc,intel c…..。

转载于:https://my.oschina.net/pangzhuzhu/blog/317921

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109726.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 点击APP引用service却进入了class文件的解决[通俗易懂]

    点击APP引用service却进入了class文件的解决[通俗易懂]现象:app项目引用service,点击类,进入了calss文件。解决:APP项目右击,bulidpath在javabulidpath中的Projects中点击add加入对应的service,最后apply,如果还未解决,在orderandexport中将对应的serviceup到最上面。…

    2022年6月24日
    31
  • Visual Studio 连接SQL Server数据库[通俗易懂]

    Visual Studio 连接SQL Server数据库[通俗易懂]VisualStudio连接SQLServer数据库在visualStudio开发环境中,从菜单中选择“工具”->“链接到数据库”命令,然后弹出图(1)所示窗口,点击更改按钮,选择你所使用的数据源类型,如下图(2)所示,点击确定。图(1)更改数据源类型图(2)选择数据源类型此时可以点击“浏览”按钮添加数据库文件,如下图(3)所示…

    2022年7月24日
    25
  • 在 pycharm中安装pytorch

    在 pycharm中安装pytorch参考文章:在pycharm中安装pytorch:https://blog.csdn.net/weixin_43183872/article/details/83473009torch包在pycharm里面的导入问题:https://blog.csdn.net/qq_31187803/article/details/79601643…

    2022年8月25日
    6
  • app设计ui规范2020_ios系统ui设计规范

    app设计ui规范2020_ios系统ui设计规范1.设计稿与切片稿a.尺寸设计稿:iPhone6750*1334【2倍】切图稿:iPhone62208*1242【3倍】Android1920*1080设计稿选择750*1334px的原因:IOS:向上和向下适配的时候界面调整的幅度最小,最方便适配Android:设计时只需做最小的设计调整,提升设计效率b.切图IOS切图——3份:………

    2022年8月13日
    7
  • pycharm过期了_pycharm到期怎么延长

    pycharm过期了_pycharm到期怎么延长pycharm的LICENSE过期1.把jetbrains-agent.jar复制到bin目录下,我的是在download里,找了半天才找到2.vmoptions64和vmoptions最后加上-javaagent:/目录/jetbrains-agent.jar一定不要写错,写错出不来注册框3.注册框弹出来,选择Licenseserver方式,地址填入:http://jetbrain…

    2022年8月28日
    2
  • Keras学习率调整

    Keras学习率调整Keras提供两种学习率适应方法,可通过回调函数实现。1.LearningRateSchedulerkeras.callbacks.LearningRateScheduler(schedule)该回调函数是学习率调度器.参数schedule:函数,该函数以epoch号为参数(从0算起的整数),返回一个新学习率(浮点数)代码importkeras.backenda…

    2022年6月14日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号