zoukankan      html  css  js  c++  java
  • 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的方式。

  • 相关阅读:
    【Python基础编程036 ● 容器 : 字符串、列表、元组、字典 ● 定义字符串的格式】
    【Python基础编程035 ● 判断语句和循环语句 ● for循环语句】
    【Python基础编程034 ● 判断语句和循环语句 ● while循环实现猜拳游戏】
    【Python基础编程033 ● 判断语句和循环语句 ● 转义字符】
    【Python基础编程032 ● 判断语句和循环语句 ● 循环嵌套中的break和continue的使用 】
    【Python基础编程031 ● 判断语句和循环语句 ● whie循环练习-打印三角形 】
    【Python基础编程030 ● 判断语句和循环语句 ● while循环练习-打印正方形 】
    (14)python网络编程,多线程socket(待写)
    【IO压测】sql server使用Diskspd测试SQL Server IO存储
    sql server使用T-SQL读取扩展事件
  • 原文地址:https://www.cnblogs.com/highsky/p/5515543.html
Copyright © 2011-2022 走看看