为什么需要Cygwin和MinGW ?
Why are Cygwin and MinGW necessary?
我一直在试图理解Cygwin和MinGW到底是什么,发现它非常令人困惑。如果你想用c++编程,你不需要一个c++编译器吗?从我读到的内容来看,他们似乎在努力为Windows提供一个类似Unix的操作系统,但我不认为这有什么意义。我是说有什么原因c++不能在Windows上原生编译吗?我还读到它们包含库,这是因为c++核心语言不支持许多函数,所以非常常见的库,如math.h
附带吗?
这个解释肯定已经写在其他地方了,但无论如何,这里是…
Cygwin是一个建立在Win32 API之上的POSIX兼容运行时。它提供了一个很大程度上兼容的POSIX C库,围绕它,有一种带有包管理器的"Cygwin发行版",允许您安装大量移植到Cygwin下运行的Unix程序。这些包括Unix shell, GCC(用于Cygwin), X,一堆交叉编译器,等等。MinGW(-w64)是提供免费(如在公共领域)Win32头文件和库的项目。您可以将其视为Windows SDK(旧版本)中头文件和库的免费替代品。它们可以与GCC一起使用。项目和其他第三方都为Windows提供本机GCC构建,这些构建根本不需要Cygwin。这些软件包可以被看作是Windows SDK的"完整"(在MinGW(-w64)的完整程度上)替代品。
请注意,Cygwin也为Win32交叉编译器提供Cygwin:这些编译器运行在Cygwin平台上,但生成本地的Win32可执行文件。
另一个播放器,MSYS,是Cygwin的轻量级分支,它只提供最少量的工具来在Windows上运行autotools构建脚本。MSYS必须与本地的MinGW(-w64)工具一起使用,它不是Cygwin,你不能轻易扩展MSYS。
所以"MinGW(-w64)"通常指的是整个Free Windows GNU工具链(本机或运行在Cygwin之上的交叉编译器),尽管严格来说它只是头文件和库。
要使用GCC的c++编译器,我建议您使用我的包(创建32位和64位可执行文件)或mingw-builds。或者,您可以安装Cygwin并使用它的setup.exe来安装MinGW-w64交叉编译器,并从那里使用它,但是如果您不需要为构建脚本提供近乎完美的Unix仿真,我建议不要这样做。
EDIT您可能知道,也可能不知道还有另一种选择,即旧的Interix,它避开了Win32子系统,直接构建在NT内核之上。这以Windows Services for Unix
或Subsystem for Unix Applications
的形式提供(适用于Windows 7和Windows 8以及更早版本的Windows)。此解决方案适用于Windows Pro/Ultimate版本客户,并为您提供最接近本机Unix的支持。哎呀,你甚至可以使用Visual Studio来调试你的Unix软件:)
注:这个答案并不假装详尽,它只是想对一个概念提出一个简单的理解,脱离思想上的定义。使用不精确的语言是有意的。所以,操作系统大师们,请不要期待完美的定义。
区别在于POSIX/UNIX和windows的根。
POSIX是一个用于操作系统(包括Shell和实用程序)的编程C接口。
Unix和后来的Linux自己实现了这样的接口,Windows本身没有。它有自己的方式来管理操作系统实体(Win32)。Mac OS也没有。
GCC是提供POSIX接口的系统上常见的编译器套件。
要在Windows上使用它,目前有两种选择:
-
为windows添加一个库(代码和头),该库将POSIX接口添加到windows(将POSIX调用转换为windows调用)并通过编译它们来移植所有GNU程序(基于Linux的):这就是Cygwin所做的。
-
重写POSIX程序,使其包含与POSIX-Windows映射相关的所有内容,生成本机Windows可执行文件:这就是MinGW和MSYS的作用。
两种方法各有优缺点。简而言之,在Cygwin中,如果某些东西在POSIX下编译,它就会在Cygwin下编译(至少在理论上)。但结果是一个在windows下运行的类似unix的程序。
在MinGW中,您可以编写本机windows程序(通过调用本机Win32 C接口),但是您不能使用windows中不存在的POSIX功能编译所有内容。最明显的例子是MinGW缺少标准的<thread>
接口,<locale>
支持有限。
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- Windows/Cygwin - 不能使用 pybind11 - 犯错误
- 如何将C++中的库和头与MinGW一起使用
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 无法在windows上使用mingw将sqlite3与c连接
- 在cygwin中运行c++脚本时发生错误
- 在cygwin中测试新的boost安装时出现cpp错误
- MinGw 无法从 cmake 编译测试文件
- MinGW在Cygwin上.关于链接GNU科学图书馆的一些问题
- 我可以在计算机上同时在计算机上同时使用Cygwin和Mingw吗?
- 在cygwin中使用mingw编译器编译c ++程序时缺少dll。
- 如何更改为使用cygwin下的g++mingw工具链
- 如何在Cygwin和MinGW中告诉C++库路径
- 在Windows上编译C++(Mingw / Cygwin)
- 使用cygwin从Nmake切换到MinGW
- std::thread在cygwin中工作,但在MinGw中不起作用
- rand_r不在作用域中,gcc-mingw在windows上的cygwin下
- 为什么需要Cygwin和MinGW ?
- 我怎样才能把水冲干净?(环境:Mingw编译器,运行在xterm或minty的Cygwin)
- 在cygwin中编译新的mingw二进制文件