Cygwin VS MinGW
首先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这种模拟的方式来提供的。
总之这两个项目有千丝万缕的关系,一个不恰当的比方,如果Mingw是MFC,Cygwin就是.NET了。
MinGW是跑在windows上的gcc toolchain,跟msvc编译器是同范畴的东西, Cygwin和MSYS是跑在windows上的可运行POSIX应用程序的工具环境,shell环境,跟linux下的wine同范畴。
=====================
1.修改编译器,让window下的编译器把诸如fork的调用翻译成等价的形式--这就是mingw的做法.
2.修改库,让window提供一个类似unix提供的库,他们对程序的接口如同unix一样,而这些库,当然是由win32的API实现的--这就是cygwin的做法.
cygwin/bin目录中有许多的linux命令,但是都是exe文件,比如cat,pwd等,还有著名的cygwin1.dll,这些命令可以在cygwin环境中调用,也可以直接在cmd命令中调用,说明cygwin环境并不是命令执行的必须,而是提供了一个类linux的显示以及对windows文件目录的映射等功能。应该可以想象,这些exe文件里面包含都是linux的系统调用,但是通过cygwin1.dll做了window系统调用的转换。没有对命令的源代码做改动。Cygwin的功能比较多,甚至还可以有X功能,最适合在windows下学习linux,而MinGW和MSYS的功能很少。
至于MinGW,主要是一个编译器,用来编译链接成windows程序,但是源代码不能使用MFC,只能用winsdk或者linux API,在编译时会对linux API作了window系统调用的替换。其实相当于把linux的命令都重新在windows下实现了一遍,生成的代码就是原生windows程序,执行效率高。
MSYS,提供了linux命令在windows下的实现,用于对功能不足的MinGW进行补充。在msys目录下也有类似的linux命令,用的应该也是类似Cygwin的方式。
Cygwin VS MinGW的更多相关文章
- [cross compile]cygwin和mingw
转自:http://blog.csdn.net/embededvc/article/details/6829010 1. MinGW和CygWin/gcc概念 Unix下编译通过的C代码,在win32 ...
- Cygwin 与 MinGW/MSYS/MSYS2,如何选择?甚至还有GNU utilities for Win32
Cygwin与MinGW/MSYS,如何选择? 2012-11-03更新:加入 MSYS 的内容. 2013-10-15更新:修改表格格式,加入介绍链接. 2014-12-17更新:加入 MSYS2 ...
- windows - Cygwin和MinGW有什么区别?(MinGW从Cygwin 1.3.3版本中分离出来)
windows - Cygwin和MinGW有什么区别? 我想让我的C ++项目跨平台,我正在考虑使用Cygwin / MinGW. 但是他们之间有什么区别呢? 另一个问题是,如果没有Cygwin / ...
- cygwin和mingw的区别
之前由于做一些JNI的开发,安装了MinGW,最近有个项目需要用到cygwin,于是就有个疑问,这两个东西有什么区别?在网上看了些资料,在这里复制粘贴一下,以备后查. Unix下编译通过的C代码,在w ...
- Cygwin、MinGw、mingw-w64,MSys msys2区别与联系
https://www.biaodianfu.com/cygwin-ming-msys.html http://www.mingw-w64.org/doku.php http://blog.csdn. ...
- Cygwin与minGW
这几天关注了一下它们, 事实上我是不想安装一下vs来编写一些小东西. 本来想写个小exe,于是跑到vs的bin以下把cl与link搞出来,却发现cl还要配置什么的,也不太清楚直接就二个exe与部分dl ...
- CygWin、MinGw和Msys的区别
做了6年的Windows C++,觉得已经没什么挑战力:而且Windows C++已经没落,不得不转Linux C++: 习惯了Windows的界面,习惯了傻瓜式的VS IDE,现在遇到Linux命令 ...
- C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项
目录 . 引言 . 交叉编译 . Cygwin简介 . 静态库编译及使用 . 动态库编译及使用 . MinGW简介 . CodeBlocks简介 0. 引言 UNIX是一个注册商标,是要满足一大堆条件 ...
- MinGw 和 cygwin 的区别和联系
原创 by zoe.zhang .......................................................... 1. windows与Linux操作系统的不同 ...
随机推荐
- DSOFramerControl简单使用
以前大学做项目(Web的毕业论系统)就看见过在网页中嵌入Office的word,那时候用了哪个控件当时没记下来,我倒是忘了,最近发现在WinForm要嵌入Office的话,可以使用DSOFramerC ...
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...
- 框架Spring笔记系列 一 基础
主题:Spring 1.什么样的问题,使得Spring框架应用而生?使用Spring解决了那些问题? 2.
- Linux命令速查手册,超详细Linux命令教程
一.常用命令速查 ls cd pwd cat more less tail head cp scp mv mkdir rmdir touch rm ps kill top free clear tre ...
- Myeclipse10下载,安装,破解,插件,优化介绍
一.Myeclipse10下载与破解 Genuitec 公司发布了MyEclipse 10,一款Genuitec旗下的商业化Eclipse集成开发工具的升级版本.MyEclipse 10基于Eclip ...
- HTML学习总结
首先,我们要问,什么是html?官方的解释是:超文本标记语言.什么意思呢?简单的来说,就是一种用来制作网页的特殊语言.那么,什么是网页呢?我们说,网页是一个在浏览器窗口下显示的页面,实质上是一个文档. ...
- 【CSS3】 CSS3:弹性盒子(Flex Box)
Flex布局是什么 如何指定一个容器为Flex布局 Flex的基本语法 display flex-direction justify-content align-items flew-wrap ali ...
- [DeviceOne开发]-地区选择
一.简介 该demo主要通过do_ComboBox和do_Picker的selectChanged事件,实现省市县三级联动的功能 二.效果图 三.源码地址 https://github.com/do- ...
- SharePoint 2013 数据库中手动更新用户信息
在SharePoint的使用过程中,尤其是Windows认证的情况下,而且没有配置用户配置文件服务,经常会出现如果更新AD中的用户信息(包括名字.显示名.邮件等),SharePoint这边站点并不会更 ...
- Android HTTP实例 使用GET方法和POST方法发送请求
Android HTTP实例 使用GET方法和POST方法发送请求 Web程序:使用GET和POST方法发送请求 首先利用MyEclispe+Tomcat写好一个Web程序,实现的功能就是提交用户信息 ...