作为简化,它是这样的:
在 Cygwin 中编译一些东西,你正在为 Cygwin 编译它。
在 MinGW 中编译一些东西,你正在为 Windows 编译它。
关于 Cygwin
Cygwin 是一个兼容层,通过模拟基于 Unix 的操作系统提供的许多基本接口,例如管道、Unix 样式的文件和目录访问等,可以轻松地将简单的基于 Unix 的应用程序移植到 Windows。由 POSIX 标准记录。如果您有使用这些接口的现有源代码,您可以在进行很少甚至没有更改后编译它以与 Cygwin 一起使用,从而大大简化了移植简单的基于 IO 的 Unix 代码以在 Windows 上使用的过程。
当您分发您的软件时,接收者需要将它与 Cygwin 运行时环境(由文件 cygwin1.dll
提供)一起运行。您可以将其与您的软件一起分发,但您的软件必须遵守其开源许可证。即使只是将您的软件与其链接,但单独分发 dll,仍然可以对您的代码施加许可证限制。
关于明威
MinGW 旨在简单地成为 GNU 的 Windows 开发工具的一个端口。它不尝试模拟或提供与 Unix 的全面兼容性,而是提供可在 Windows 中本地使用的 GNU Compiler Collection、GNU Binutils 和 GNU Debugger 版本。它还包括允许在代码中使用 Windows 原生 API 的头文件。
因此,您的应用程序需要使用 Windows API 专门针对 Windows 进行编程,如果创建它以依赖于在标准 Unix 环境中运行并使用 Unix 特定功能,这可能意味着重大改变。默认情况下,在 MinGW 的 GCC 中编译的代码将编译为本机 Windows X86 目标,包括 .exe 和 .dll 文件,尽管您也可以使用正确的设置进行交叉编译,因为您基本上使用的是 GNU 编译器工具套件。
MinGW 是在 Windows 上使用 Microsoft Visual C++ 编译器及其相关链接/制作工具的免费开源替代方案。在某些情况下,可以使用 MinGW 编译旨在使用 Microsoft Visual C++ 编译的内容,而无需进行太多修改。
尽管 MingW 包含一些头文件和接口代码,允许您的代码与 Windows API 交互,但与常规标准库一样,这不会对您创建的软件施加许可限制。
其他注意事项
对于任何重要的软件应用程序,例如使用图形界面、多媒体或访问系统上的设备的应用程序,您离开了 Cygwin 可以为您做的事情的界限,需要进一步的工作来使您的代码跨平台。但是,可以通过使用跨平台工具包或框架来简化此任务,这些工具包或框架允许编码一次并为任何平台成功编译您的代码。如果您从一开始就使用这样的框架,您不仅可以减少移植到另一个平台时的麻烦,而且您可以在所有平台上使用相同的图形小部件——窗口、菜单和控件——如果你正在编写一个GUI 应用程序,并让它们对用户来说是原生的。
例如,开源 Qt framework 是一种流行且全面的跨平台开发框架,允许构建跨操作系统(包括 Windows)工作的图形应用程序。还有其他这样的框架。除了大型框架之外,还有数千个更专业的软件库,它们支持多个平台,让您不必担心为不同平台编写不同的代码。
当您从一开始就开发跨平台软件时,通常没有任何理由使用 Cygwin。在 Windows 上编译时,您通常的目标是使您的代码能够使用 MingW 或 Microsoft Visual C/C++ 进行编译,或两者兼而有之。在 Linux/*nix 上编译时,您通常会直接使用 GNU 编译器和工具对其进行编译。
Cygwin 试图在 Windows 上创建一个完整的 UNIX/POSIX 环境。为此,它使用各种 DLL。虽然 GPLv3+ 涵盖了这些 DLL,但它们的许可证包含 an exception,这并不强制 GPLv3+ 涵盖派生作品。 MinGW 是一个 C/C++ 编译器套件,它允许您在不依赖此类 DLL 的情况下创建 Windows 可执行文件 - 您只需要正常的 MSVC 运行时,它们是任何正常的 Microsoft Windows 安装的一部分。
您还可以获得一个类似 UNIX/POSIX 的小型环境,使用名为 MSYS 的 MinGW 编译。它不具备 Cygwin 的所有功能,但非常适合想要使用 MinGW 的程序员。
为了添加其他答案,Cygwin 附带了 MinGW 库和头文件,您可以通过使用 -mno-cygwin 标志和 gcc 来编译而不链接到 cygwin1.dll。我非常喜欢使用普通的 MinGW 和 MSYS。
gcc-3 -mno-cygwin
mingw64-x86_64-gcc-core
Cygwin 软件包。 MinGW-64 将作为尴尬命名的 x86_64-w64-mingw32-gcc
命令提供。 拜托各位大神,已经有人把这些该死的东西的名字统一起来了。
Wikipedia 进行了比较 here。
来自 Cygwin 的 website:
Cygwin 是一个类似 Linux 的 Windows 环境。它由两部分组成: 一个 DLL (cygwin1.dll),它充当 Linux API 仿真层,提供大量 Linux API 功能。一组提供 Linux 外观的工具。
来自 Mingw 的 website:
MinGW(“Minimalistic GNU for Windows”)是一组可免费使用和可免费分发的 Windows 特定头文件和导入库,并结合 GNU 工具集,允许生成不依赖任何第 3 方 C 运行时 DLL 的本机 Windows 程序
Cygwin 使用 DLL、cygwin.dll(或者可能是一组 DLL)在 Windows 上提供类似 POSIX 的运行时。
MinGW 编译为本机 Win32 应用程序。
如果您使用 Cygwin 构建某些东西,那么您安装它的任何系统也都需要 Cygwin DLL。 MinGW 应用程序不需要任何特殊的运行时。
阅读这些已回答的问题以了解 Cygwin 和 MinGW 之间的区别。
问题#1:我想创建一个应用程序,我编写一次源代码、编译一次并在任何平台(例如Windows、Linux 和Mac OS X ......)上运行它。
答案 #1:用 JAVA 编写源代码。一次编译源代码并在任何地方运行它。
问题#2:我想创建一个我编写一次源代码的应用程序,但是我为任何平台(例如Windows、Linux 和Mac OS X ...)单独编译源代码是没有问题的。
答案 #2:用 C 或 C++ 编写源代码。仅使用标准头文件。为任何平台使用合适的编译器(例如,适用于 Windows 的 Visual Studio、适用于 Linux 的 GCC 和适用于 Mac 的 XCode)。请注意,您不应使用任何高级编程功能在所有平台上成功编译源代码。如果您不使用 C 或 C++ 标准类或函数,则您的源代码无法在其他平台上编译。
问题#3:在回答问题#2 时,很难为每个平台使用不同的编译器,是否有任何跨平台编译器?
答案 #3:是的,使用 GCC 编译器。它是一个跨平台编译器。要在 Windows 中编译您的源代码,请使用 MinGW,它为 Windows 提供 GCC 编译器并将您的源代码编译为本地 Windows 程序。不要使用任何高级编程功能(如 Windows API)在所有平台上成功编译您的源代码。如果您使用 Windows API 函数,您的源代码不会在其他平台上编译。
问题 #4:C 或 C++ 标准头文件不提供任何高级编程功能,如多线程。我能做些什么?
答案 #4:您应该使用 POSIX(便携式操作系统接口 [for UNIX])标准。它提供了许多高级编程功能和工具。许多操作系统完全或部分兼容 POSIX(如 Mac OS X、Solaris、BSD/OS 和...)。一些操作系统虽然没有被官方认证为兼容 POSIX,但在很大程度上符合(如 Linux、FreeBSD、OpenSolaris 和...)。 Cygwin 为 Microsoft Windows 提供了一个很大程度上符合 POSIX 标准的开发和运行时环境。
因此:
要在 Windows 中使用 GCC 跨平台编译器,请使用 MinGW。
要在 Windows 中使用 POSIX 标准高级编程功能和工具,请使用 Cygwin。
从移植 C 程序的角度来看,理解这一点的一个好方法是举一个例子:
#include <sys/stat.h>
#include <stdlib.h>
int main(void)
{
struct stat stbuf;
stat("c:foo.txt", &stbuf);
system("command");
printf("Hello, World\n");
return 0;
}
如果我们将 stat
更改为 _stat
,我们可以用 Microsoft Visual C 编译这个程序。我们也可以用 MinGW 和 Cygwin 编译这个程序。
在 Microsoft Visual C 下,程序将链接到 MSVC 可再发行运行时库:mxvcrtnn.dll
,其中 nn
是某个版本后缀。要发布这个程序,我们必须包含那个 DLL。该 DLL 提供 _stat
、system
和 printf
。 (我们还可以选择静态链接运行时。)
在 MinGW 下,该程序将链接到 msvcrt.dll
,这是一个内部的、未记录的、未版本化的库,它是 Windows 的一部分,并且禁止应用程序使用。该库本质上是来自 MS Visual C 的可再发行运行时库的一个分支,供 Windows 本身使用。
在这两种情况下,程序都会有类似的行为:
stat 函数将返回非常有限的信息——例如,没有有用的权限或 inode 号。
路径 c:file.txt 根据与驱动器 c: 关联的当前工作目录解析。
系统使用 cmd.exe /c 来运行外部命令。
我们也可以在 Cygwin 下编译程序。与 MS Visual C 使用的可再发行运行时类似,Cygwin 程序将链接到 Cygwin 的运行时库:cygwin1.dll
(Cygwin 专有)和 cyggcc_s-1.dll
(GCC 运行时支持)。由于 Cygwin 现在在 LGPL 下,我们可以与我们的程序一起打包,即使它不是与 GPL 兼容的自由软件,并发布程序。
在 Cygwin 下,库函数的行为会有所不同:
stat 函数具有丰富的功能,可以在大多数字段中返回有意义的值。
路径 c:file.txt 根本不被理解为包含驱动器号引用,因为 c: 后面没有斜杠。冒号被认为是名称的一部分,并以某种方式被破坏了。 Cygwin 中没有针对卷或驱动器的相对路径的概念,没有“当前记录的驱动器”概念,也没有每个驱动器的当前工作目录。
系统函数尝试使用 /bin/sh -c 解释器。 Cygwin 将根据您的可执行文件的位置解析 / 路径,并期望 sh.exe 程序与您的可执行文件位于同一位置。
Cygwin 和 MinGW 都允许您使用 Win32 函数。如果您想调用 MessageBox
或 CreateProcess
,您可以这样做。您还可以在 MinGW 和 Cygwin 下使用 gcc -mwindows
轻松构建不需要控制台窗口的程序。
Cygwin 不是严格意义上的 POSIX。除了提供对 Windows API 的访问之外,它还提供自己的一些 Microsoft C 函数的实现(在 msvcrt.dll
或可重新分发的 msvcrtnn.dll
运行时中找到的东西)。这方面的一个例子是 spawn*
系列函数,如 spawnvp
。在 Cygwin 上使用这些代替 fork
和 exec
是一个好主意,因为它们更好地映射到没有 fork
概念的 Windows 进程创建模型。
因此:
Cygwin 程序与 MS Visual C 程序一样“原生”,因为它需要库的伴奏。 Windows 上的编程语言实现有望提供自己的运行时,甚至 C 语言实现。 Windows 上没有供公众使用的“libc”。
MinGW 不需要第三方 DLL 的事实实际上是一个劣势;它依赖于 Visual C 运行时的未记录的、Windows 内部的分支。 MinGW 这样做是因为 GPL 系统库异常适用于 msvcrt.dll,这意味着可以使用 MinGW 编译和重新分发 GPL 版本的程序。
由于与 msvcrt.dll 相比,它对 POSIX 的支持更广泛、更深入,因此 Cygwin 是迄今为止移植 POSIX 程序的优越环境。由于它现在属于 LGPL,它允许重新分发具有各种许可证(开源或闭源)的应用程序。 Cygwin 甚至包含与 Microsoft 控制台一起使用的 VT100 仿真和 termios!使用 tcsetattr 设置原始模式并使用 VT100 代码控制光标的 POSIX 应用程序将在 cmd.exe 窗口中正常工作。就最终用户而言,它是一个本机控制台应用程序,通过 Win32 调用来控制控制台。
然而:
作为一个原生的 Windows 开发工具,Cygwin 有一些怪癖,比如路径处理对 Windows 来说是陌生的,依赖于一些硬编码的路径,如 /bin/sh 和其他问题。这些差异使 Cygwin 程序“非本地”。如果程序将路径作为参数或从对话框输入,Windows 用户希望该路径与其他 Windows 程序中的工作方式相同。如果它不能那样工作,那就有问题了。
插件:在 LGPL 发布后不久,我启动了 Cygnal(Cygwin 本地应用程序库)项目,以提供旨在解决这些问题的 Cygwin DLL 的分支。程序可以在 Cygwin 下开发,然后使用 Cygnal 版本的 cygwin1.dll
进行部署,无需重新编译。随着这个库的改进,它将逐渐消除对 MinGW 的需求。
当 Cygnal 解决了路径处理问题时,将可以开发一个可执行文件,该可执行文件在作为 Windows 应用程序与 Cygnal 一起发布时与 Windows 路径一起使用,并且在安装在 Cygwin 下的 /usr/bin
中时与 Cygwin 路径无缝协作。在 Cygwin 下,可执行文件将透明地使用 /cygdrive/c/Users/bob
之类的路径。在与 Cygnal 版本的 cygwin1.dll
链接的本机部署中,该路径将毫无意义,但它会理解 c:foo.txt
。
其他答案已经达到目标。我只想添加一个插图以便快速了解。
https://i.stack.imgur.com/RFhqo.png
MinGW 从 Cygwin 的 1.3.3 版分叉。尽管 Cygwin 和 MinGW 都可用于将 UNIX 软件移植到 Windows,但它们有不同的方法:Cygwin 旨在提供一个完整的 POSIX 层,该层提供对 Linux、UNIX 和 BSD 变体上存在的多个系统调用和库的模拟。 POSIX 层在 Windows 之上运行,在必要时牺牲了性能以实现兼容性。因此,这种方法需要使用 Cygwin 编写的 Windows 程序在必须与程序一起分发的 copyleft 兼容库之上运行,以及程序的源代码。 MinGW 旨在通过直接 Windows API 调用提供本机功能和性能。与 Cygwin 不同,MinGW 不需要兼容层 DLL,因此程序不需要与源代码一起分发。因为 MinGW 依赖于 Windows API 调用,它不能提供完整的 POSIX API;它无法编译一些可以用 Cygwin 编译的 UNIX 应用程序。具体来说,这适用于需要诸如 fork()、mmap() 或 ioctl() 等 POSIX 功能的应用程序以及那些希望在 POSIX 环境中运行的应用程序。使用本身已移植到 MinGW 的跨平台库编写的应用程序,例如 SDL、wxWidgets、Qt 或 GTK+,通常在 MinGW 中编译就像在 Cygwin 中一样容易。 MinGW 和 MSYS 的组合提供了一个小型、独立的环境,可以将其加载到可移动媒体上,而无需在注册表中留下条目或在计算机上留下文件。 Cygwin Portable 提供了类似的功能。通过提供更多功能,Cygwin 的安装和维护变得更加复杂。也可以在 POSIX 系统下使用 MinGW-GCC 交叉编译 Windows 应用程序。这意味着开发人员不需要安装带有 MSYS 的 Windows 来编译将在没有 Cygwin 的情况下在 Windows 上运行的软件。
apt-cyg
因为它可能比在 WSL 下使用 apt 更容易。
不要忽视 AT&T 的 U/Win 软件,该软件旨在帮助您在 Windows 上编译 Unix 应用程序(最新版本 - 2012-08-06;使用 Eclipse Public License,版本 1.0)。
像 Cygwin 一样,它们必须与库竞争。在他们的情况下POSIX.DLL
。 AT&T 的家伙是了不起的工程师(为您带来 ksh 和 dot 的同一组),他们的东西值得一试。
要在非自由/专有/闭源应用程序中使用 Cygwin,您需要花费数万美元购买 Red Hat 的“license buyout”;这以相当大的代价使 standard licensing terms 无效。谷歌“cygwin license cost”并查看前几个结果。
对于 mingw,不会产生这样的成本,并且许可证(PD、BSD、MIT)非常宽松。您最多可能需要在您的应用程序中提供许可证详细信息,例如使用 mingw64-tdm 时所需的 winpthreads 许可证。
感谢 Izzy Helianthus 编辑:商业许可证不再可用或不再需要,因为在 LGPL 下的 Cygwin is now being distributed 的 winsup 子目录中找到的 API 库,而不是完整的 GPL。
Cygwin 模拟整个 POSIX 环境,而 MinGW 是仅用于编译的最小工具集(编译本机 Win 应用程序。)因此,如果您想让您的项目跨平台,两者之间的选择是显而易见的,MinGW。
尽管您可能会考虑在 Windows 上使用 VS,在 Linux/Unices 上使用 GCC。大多数开源项目都是这样做的(例如 Firefox 或 Python)。
clang
是一个可行的跨平台解决方案。
请注意,实用程序行为可能在两者之间真正有所不同。
例如,Cygwin tar 可以分叉——因为 DLL 支持 fork()——而 mingw 版本不能。这是尝试从源代码编译 mysql 时出现的问题。
Cygwin 旨在为 Windows 提供或多或少完整的 POSIX 环境,包括旨在提供成熟的类 Linux 平台的广泛工具集。相比之下,MinGW 和 MSYS 提供了一个轻量级、极简的类似 POSIX 的层,只有 gcc
和 bash
等更重要的工具可用。由于 MinGW 更简约的方法,它不提供 Cygwin 提供的 POSIX API 覆盖程度,因此无法构建某些可以在 Cygwin 上编译的程序。
就两者生成的代码而言,Cygwin 工具链依赖于动态链接到大型运行时库 cygwin1.dll
,而 MinGW 工具链将代码编译为动态链接到 Windows 原生 C 库 msvcrt.dll
的二进制文件以及静态到 glibc
的部分。因此,Cygwin 可执行文件更紧凑,但需要单独的可再发行 DLL,而 MinGW 二进制文件可以独立发布,但往往更大。
基于 Cygwin 的程序需要单独的 DLL 才能运行这一事实也导致了许可限制。 Cygwin 运行时库在 GPLv3 下获得许可,对于具有 OSI 兼容许可证的应用程序有一个链接例外,因此希望围绕 Cygwin 构建闭源应用程序的开发人员必须从 Red Hat 获得商业许可证。另一方面,MinGW 代码可以在开源和闭源应用程序中使用,因为标头和库是许可许可的。
Cygwin
使用兼容层,而 MinGW
是原生的。这是主要区别之一。
MinGW (or MinGW-w64) Cygwin
-------------------- ------
Your program written Your program written
for Unix and GNU/Linux for Unix and GNU/Linux
| |
| |
V V
Heavy modifications Almost no modifications
| |
| |
V V
Compilation Compilation
Program compiled with Cygwin ---> Compatibility layer ---> Windows API
Program compiled with MinGW (or MingGW-w64) -------------> Windows API