Cygwin和MinGW的区别与联系是怎样的?
- Cygwin
- MinGW
- 两者的区别和联系
- 参考资料
Cygwin和MinGW都是为Windows系统开发者设计的工具。
Cygwin
Cygwin, 原Cygnus出品,目前是RedHat名下的项目。项目的目的是提供运行于Windows平台的类Unix环境(以GNU工具为代表),为了达到这个目的,Cygwin提供了一层抽象层dll,用于将部分Posix调用转换成Windows的API调用,实现相关功能。其中最典型的,最基本的模拟层就是那个cygwin1.dll。除此之外,随着Linux系统的发展,目前Cygwin已经不仅仅提供POSIX兼容,因此也顺带多了更多模拟层的依赖关系。
Cygwin的目录结构基本照搬了Linux的样子,同时也兼容了Windows的许多功能:大部分应用使用Unix风格的路径,Windows的盘符通过类似挂载点的方式提供给Cygwin使用。Cygwin中既可以运行Cygwin的应用(依赖模拟层),又可以运行Windows应用,而传递给应用的路径会经过它的模拟层变换,以此保证程序运行不会出错。事实上,Cygwin诞生支出,本就是想通过GCC编译出Windows应用来。
总之,Cygwin是运行于Windows平台的POSIX子系统,提供Windows下的类Unix环境,并提供将部分Linux应用移植到Windows平台的开发环境的一套软件。即Cygwin是一个开放源码项目,旨在提供类Unix环境在Windows上的实现,使用户能够在Windows系统上使用类似于Linux/Unix的软件和工具。它提供了一个兼容层,允许在Windows上编译和运行POSIX应用程序。
MinGW
MinGW是“Minimalist GNU for Windows”的缩写,是一个在Windows上构建GNU工具链的项目。MinGW提供一组开发工具,包括编译器和相关工具,允许在Windows上构建本地Windows应用程序,同时尽可能地减少对POSIX层的依赖。
它主要提供了针对win32应用的GCC,GNU binutils等工具,以及对等于Windows SDK(的子集)的头文件和用于MinGW版本linker的库文件(so,a等,而不是VC的lib)。
MinGW能够替代cl用于编译不包含MFC的,以WinSDK为主的Windows应用,并且编译出来的应用不依赖于第三方的模拟层支持,其运行时为大部分Windows标配的msvcrt(故称原生Windows应用)。除此之外,MinGW也支持GCC支持的其他语言。
简而言之,MinGW是一些头文件和端口库的集合,该集合允许人们在没有第三方动态链接库的情况下使用 GCC(GNU Compiler C)产生 Windows32 程序。实际上 MinGW 并不是一个 C/C++ 编译器,而是一套 GNU 工具集合。除开 GCC (GNU 编译器集合) 以外,MinGW 还包含有一些其他的 GNU 程序开发工具 (比如 gawk bison 等等)。开发 MinGW 是为了那些不喜欢工作在 Linux(FreeBSD) 操作系统而留在 Windows 的人提供一套符合 GNU 的 GNU 工作环境。
两者的区别和联系
两者的主要区别在于目标和工作方式。Cygwin旨在提供与Unix兼容的开发环境,包括POSIX兼容性,并提供Linux风格的工具。MinGW专注于提供Windows上开发本地Windows应用程序所需的GNU工具,同时尽可能减少对POSIX接口的依赖。
MinGW一开始是分为两个部分的w32api和mingwrt,前者提供win32的系统头文件和系统dll的导出库,而后者提供c运行库msvcrt的导出库顺带添加了部分msvcrt没有的函数,用于支持gcc等工具链的构建;
Cygwin是在win32的基础上模拟了POSIX的接口,前文提到的w32api这个包cygwin也会用到,所以它们的区别仅仅在于MinGW只提供win32的函数导出,而Cygwin在前者的基础上有模拟了POSIX接口,而且MinGW只包括编译器和库,Cygwin提供了一个完整的类UNIX运行时环境。它们的联系从前面也能看出Cygwin包括了除msvcrt库之外的整个MinGW,Cygwin使用了newlib提供c运行时。再补充一点,新版的cygwin1.dll这个库是使用MinGW-w64工具编译的,所以说它们的关系是剪不断理还乱,只用注意Cygwin提供posix接口MinGW不提供posix接口就好了
然而,两者都允许在Windows上使用GNU工具和编译器。有时候它们可能结合使用,例如使用MinGW提供的编译器,同时使用Cygwin提供的POSIX兼容性。
参考资料
- https://www.zhihu.com/question/22137175
- Cygwin是什么
- MinGW到底是个什么