原创 by zoe.zhang

..........................................................

1. windows与Linux操作系统的不同

    windows和Linux是目前来说最流行的两大操作系统,在基本设计概念上,进程、线程、寻址、内存管理等方面都是大同小异的,但是二者之间的程序不兼容,因为二者在系统功能上是不同的,提供的系统API也是不同的。
  从最明显的几点来说:

  • 可执行文件的格式,Windows采用的是PE的格式,要求以.exe为后缀名,而Linux使用的是 elf 的格式;
  • 操作系统提供的系统API是不同的,如Windows使用CreateProcess()创建进程,而Linux使用fork()
    所以想要在Windows环境下使用Linux的编译工具,也就是gcc/g++,我们需要一个中间的转换工具或者平台,这也就是MinGW和cygwin存在的原因。

2. 什么是 MinGW

  • MinGw全称 Minimalistic GNU for Windows,某种程度上可以看做是win版本下的GCC。Mingw有一个Msys的子项目,可以提供一些模拟Linux的shell和基本的Linux工具,Msys是一个辅助环境。
  • MinGw 有专门的Win32 API的头文件,来把代码中Linux方式的系统调用替换为对应的Windows下的调用方式,某种程度上可以称之为将Linux调用 翻译为 Windows调用。

3. 什么是 cygwin

  • Cygwin 则是一个在Windows平台上运行的unix模拟环境,是cygnus solutions 公司开发的自由软件。Cygwin更像一个平台,模拟了Linux的接口,提供了运行在它上面的程序使用,提供了很多Linux环境下的GNU软件。
  • Cygwin 通过Cygwin1.dll的文件实现操作系统API的转换,模拟了Linux的调用接口给程序,程序以Linux的方式调用系统API,但这个API的目标库是Cygwin1.dll,Cygwin1.dll再调用Windows对用的方式实现,再把结果返回给程序

4. 两者的区别

  • MinGW生成的程序,究其本质调用的是Kernel.32导出的标准Windows系统API,在windows下Mingw的编译性能会高一些,编译速度也会快一些。
  • Cygwin更像一个平台,它相对完整地模拟了LInux,提供了一个接近2M的Cygwin1.dll的文件作为目标库,来模拟Linux系统的接口,但是相对来说编译的速度就要慢一些。如果想要在Windows上开发可以运行在LInux上的程序,应该选用Cygwin。
  • 总的来说:

    1. cygwin大,mingw小
    2. cygwin编译后的exe需要cygwin1.dll作为支持,而mingw不需要就可以直接运行,因为有中间层所以cygwin慢,mingw快。
    3. cygwin包含的内容更全面,能编译通过的linux源文件更多,mingw的min是minimalist所以能编译通过的更少。但,不是全部,就是说别指望你可以把任何为linux写的源代码在cygwin或mingw编译通过并运行。

5. MinGW、MinGw-w64、TDM-GCC

  • MinGW是最先出来的,但是当时只有32位系统,所以支持32位系统;
  • Mingw-w64 既支持64位,也支持32位,也支持32位和64位的交叉编译;gcc官方支持Mingw-w64,所以更建议Mingw-w64.
  • TDM-GCC: 32位的用的是Mingw,64位用的是MinGW64.
  • 此外还有一个IDE,CodeBlock,使用 起来相对简单,具有较强的跨平台性,比较适合不习惯使用命令行的新手。

6. 总结

   事实上,cygwin/gcc和Mingw都是为了gcc可以在windows下使用的编译环境,可以方便进行一些类Linux环境下的编程。但是两种平台不管是哪一种,Linux程序都不能直接运行在Windows下的,需要对程序进行重新编译,同时建议重要的源码还是应该在真正的Linux环境下进行编译。

   基于执行速度还有大小的原因,我倾向于在Windows下选择使用MinGW64.

附;Mingw-w64的环境搭建

  • 下载安装包,并安装,注意安装时的一些setting 参数。
  • 配置环境变量:环境变量输入安装的地址 ..\Mingw64\bin。
  • 验证配置是否成功:打开cmd命令行,输入gcc -v。

最新文章

  1. WebSocket异常 通常每个套接字地址(协议/网络地址/端口)只允许使用一次
  2. SQL Server监控报警架构_如何添加报警
  3. 抽象(abstract)升级版变接口(interface) 继承(extends)升级版叫实现(implements) 升级版啊升级版 接口可以多继承
  4. sdut2536字母哥站队(dp)
  5. 数组有没有 length()这个方法? String 有没有 length()这 个方法?
  6. OGG强制停止进程
  7. angular指令ng-class巧用
  8. vue 首页问题
  9. java集合框架中Set和List的区别
  10. hive理论
  11. ORACLE查看数据库已安装补丁
  12. HDU-1881 毕业bg (01背包变形)
  13. hdu2516斐波那契博弈
  14. 使用vscode实现git同步
  15. 对 getaddrinfo Android 返回错误 EAI_BADFLAGS
  16. 使用TestFlight邀请外部人员測试APP
  17. 关于Unity的C#基础学习(一)
  18. 「GXOI / GZOI2019」简要题解
  19. CPU上下文切换的次数和时间(context switch)
  20. hdu 1531 king(差分约束)

热门文章

  1. Intelligent Factorial Factorization LightOJ - 1035(水题)
  2. 【BZOJ1853】幸运数字(搜索,容斥)
  3. 解题:JSOI 2008 Blue Mary的战略地图
  4. sql数据库设计学习---数据库设计规范化的五个要求
  5. bzoj 2243
  6. Nginx反向代理websocket配置实例(官网)
  7. R语言:R2OpenBUGS
  8. python---Django中模型类中Meta元对象了解
  9. linux服务器上修改oracle数据库的字符集
  10. iscroll demo