724

我想让我的 C++ 项目跨平台,我正在考虑使用 Cygwin/MinGW。但是它们之间有什么区别?

另一个问题是我是否能够在没有 Cygwin/MinGW 的系统上运行二进制文件?

4

17 回答 17

706

作为简化,它是这样的:

  • 在 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 框架是一个流行且全面的跨平台开发框架,允许构建跨操作系统(包括 Windows)工作的图形应用程序。还有其他这样的框架。除了大型框架之外,还有数千个更专业的软件库,它们支持多个平台,让您不必担心为不同平台编写不同的代码。

当您从一开始就开发跨平台软件时,通常没有任何理由使用 Cygwin。在 Windows 上编译时,您通常的目标是使您的代码能够使用 MingW 或 Microsoft Visual C/C++ 进行编译,或两者兼而有之。在 Linux/*nix 上编译时,您通常会直接使用 GNU 编译器和工具对其进行编译。

于 2009-04-27T03:15:41.377 回答
329

Cygwin 试图在 Windows 上创建一个完整的 UNIX/POSIX 环境。为此,它使用各种 DLL。尽管 GPLv3+ 涵盖了这些 DLL,但它们的许可证包含一个例外,该例外不会强制派生作品被 GPLv3+ 涵盖。MinGW 是一个 C/C++ 编译器套件,它允许您在不依赖此类 DLL 的情况下创建 Windows 可执行文件 - 您只需要正常的 MSVC 运行时,它们是任何正常的 Microsoft Windows 安装的一部分。

您还可以获得一个类似 UNIX/POSIX 的小型环境,使用名为MSYS的 MinGW 编译。它不具备 Cygwin 的所有功能,但非常适合想要使用 MinGW 的程序员。

于 2009-04-21T09:21:20.657 回答
145

为了添加其他答案,Cygwin 附带了 MinGW 库和头文件,您可以通过使用 -mno-cygwin 标志和 gcc 来编译而不链接到 cygwin1.dll。我非常喜欢使用普通的 MinGW 和 MSYS。

于 2009-04-27T06:28:41.163 回答
63

维基百科在这里做了一个比较。

来自 Cygwin 的网站

  • Cygwin 是一个类似 Linux 的 Windows 环境。它由两部分组成: 一个 DLL (cygwin1.dll),它充当 Linux API 仿真层,提供大量 Linux API 功能。
  • 一组提供 Linux 外观的工具。

来自 Mingw 的网站

MinGW(“Minimalistic GNU for Windows”)是一组可免费使用和可免费分发的 Windows 特定头文件和导入库,并结合 GNU 工具集,允许生成不依赖任何第 3 方 C 运行时 DLL 的本机 Windows 程序

于 2009-04-21T09:21:12.573 回答
49

Cygwin 使用 DLL、cygwin.dll(或者可能是一组 DLL)在 Windows 上提供类似 POSIX 的运行时。

MinGW 编译为本机 Win32 应用程序。

如果您使用 Cygwin 构建某些东西,那么您安装它的任何系统也都需要 Cygwin DLL。MinGW 应用程序不需要任何特殊的运行时。

于 2009-04-21T09:20:21.657 回答
45

阅读这些已回答的问题以了解 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。

于 2011-04-01T00:06:02.757 回答
39

从移植 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,systemprintf. (我们还可以选择静态链接运行时。)

在 MinGW 下,该程序将链接到msvcrt.dll,这是一个内部的、未记录的、未版本化的库,它是 Windows 的一部分,并且禁止应用程序使用。该库本质上是来自 MS Visual C 的可再发行运行时库的一个分支,供 Windows 本身使用。

在这两种情况下,程序都会有类似的行为:

  • stat函数将返回非常有限的信息——例如,没有有用的权限或 inode 编号。
  • c:file.txt根据与 drive 关联的当前工作目录解析路径c:
  • system用于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 中没有针对卷或驱动器的相对路径的概念,没有“当前记录的驱动器”概念,也没有每个驱动器的当前工作目录。
  • system函数尝试使用/bin/sh -c解释器。/Cygwin 将根据可执行文件的位置解析路径,并期望sh.exe程序与可执行文件位于同一位置。

Cygwin 和 MinGW 都允许您使用 Win32 函数。如果你想打电话MessageBoxCreateProcess,你可以这样做。gcc -mwindows您还可以在 MinGW 和 Cygwin 下使用 轻松构建不需要控制台窗口的程序。

Cygwin 不是严格意义上的 POSIX。除了提供对 Windows API 的访问之外,它还提供了自己的一些 Microsoft C 函数的实现(在msvcrt.dll可重新分发的msvcrtnn.dll运行时中找到的东西)。这方面的一个例子是spawn*函数族,如spawnvp. 这些是在 Cygwin 上代替forkand使用的好主意,因为它们更好地映射到没有.execfork

因此:

  • Cygwin 程序与 MS Visual C 程序一样“原生”,因为它需要库的伴奏。Windows 上的编程语言实现有望提供自己的运行时,甚至 C 语言实现。Windows 上没有供公众使用的“libc”。

  • MinGW 不需要第三方 DLL 的事实实际上是一个劣势;它依赖于 Visual C 运行时的未记录的、Windows 内部的分支。MinGW 这样做是因为 GPL 系统库异常适用于msvcrt.dll,这意味着 GPL ed 程序可以使用 MinGW 编译和重新分发。

  • 由于与 POSIX 相比,它对 POSIX 的支持更广泛、更深入msvcrt.dll,因此 Cygwin 是迄今为止移植 POSIX 程序的优越环境。由于它现在属于 LGPL,它允许重新分发具有各种许可证(开源或闭源)的应用程序。 Cygwin 甚至包含 VT100 仿真和termios,可与 Microsoft 控制台一起使用!使用 VT100 代码设置原始模式tcsetattr并使用 VT100 代码控制光标的 POSIX 应用程序将在cmd.exe窗口中正常工作。就最终用户而言,它是一个本机控制台应用程序,通过 Win32 调用来控制控制台。

然而:

  • 作为一个原生的 Windows 开发工具,Cygwin 有一些怪癖,比如路径处理对 Windows 来说是陌生的,对一些硬编码路径的依赖/bin/sh等问题。这些差异使 Cygwin 程序“非本地”。如果程序将路径作为参数或从对话框输入,Windows 用户希望该路径与其他 Windows 程序中的工作方式相同。如果它不能那样工作,那就有问题了。

Plug:在 LGPL 发布后不久,我启动了Cygnal(Cygwin 本地应用程序库)项目,以提供旨在解决这些问题的 Cygwin DLL 的分支。程序可以在 Cygwin 下开发,然后用 Cygnal 版本部署,cygwin1.dll无需重新编译。随着这个库的改进,它将逐渐消除对 MinGW 的需求。

当 Cygnal 解决了路径处理问题时,将有可能开发一个单独的可执行文件,该可执行文件在作为 Windows 应用程序与 Cygnal 一起发布时与 Windows 路径一起使用,并且在安装在 Cygwin 下时与 Cygwin 路径无缝/usr/bin协作。在 Cygwin 下,可执行文件将透明地使用/cygdrive/c/Users/bob. 在与 Cygnal 版本链接的本机部署中cygwin1.dll,该路径将毫无意义,但它会理解c:foo.txt.

于 2016-07-06T18:48:08.627 回答
31

其他答案已经达到目标。我只想添加一个插图以便快速了解。

在此处输入图像描述

于 2019-04-19T05:54:27.620 回答
27

维基百科说

MinGW从 1.3.3 版分叉而来Cygwin。尽管两者CygwinMinGW都可以用于将UNIX软件移植到Windows,但它们有不同的方法:Cygwin旨在提供一个完整POSIX layer 的,提供对存在于LinuxUNIXBSD变体上的多个系统调用和库的模拟。POSIX layer 运行在 之上,Windows在必要时牺牲性能以实现兼容性。因此,这种方法要求 Windows用 编写的程序Cygwin在必须与程序一起分发的 copyleft 兼容库之上运行,以及程序的source code. MinGW旨在通过直接提供本机功能和性能Windows API calls。不同于 Cygwin,MinGW不需要兼容层DLL,因此程序不需要与source code.

因为MinGW是依赖Windows API calls,它不能提供一个完整的POSIX API;它无法编译一些UNIX applications可以用Cygwin. 具体来说,这适用于需要POSIX类似 的功能 的应用程序fork()mmap()或者ioctl()那些期望在 POSIX environment. 使用cross-platform library本身已被移植到的应用程序MinGW,例如SDL, wxWidgets,QtGTK+, 通常会像 MinGWCygwin.

MinGW两者的结合MSYS提供了一个小型、独立的环境,可以将其加载到可移动媒体上,而无需在注册表或计算机上的文件中留下条目。CygwinPortable 提供了类似的功能。通过提供更多功能,Cygwin 安装和维护变得更加复杂。

也可以cross-compile Windows applicationsMinGW-GCC under POSIX systems. 这意味着开发人员无需安装 WindowsMSYS即可编译Windows无需Cygwin.

于 2013-10-05T15:29:45.020 回答
15

不要忽视AT&T 的U/Win软件,它旨在帮助您在 Windows 上编译 Unix 应用程序(最新版本 - 2012-08-06;使用 Eclipse Public License,版本 1.0)。

像 Cygwin 一样,它们必须与库竞争。在他们的情况下POSIX.DLLAT&T 的家伙是了不起的工程师(为您带来 ksh 和dot的同一组),他们的东西值得一试。

于 2009-04-27T02:15:57.497 回答
11

Cygwin 模拟整个 POSIX 环境,而 MinGW 是仅用于编译的最小工具集(编译本机 Win 应用程序。)因此,如果您想让您的项目跨平台,两者之间的选择是显而易见的,MinGW。

尽管您可能会考虑在 Windows 上使用 VS,在 Linux/Unices 上使用 GCC。大多数开源项目都是这样做的(例如 Firefox 或 Python)。

于 2009-04-21T09:19:27.837 回答
11

要在非自由/专有/闭源应用程序中使用 Cygwin,您需要花费数万美元从 Red Hat购买“许可证”;这以相当高的成本使标准许可条款无效。谷歌“cygwin license cost”并查看前几个结果。

对于 mingw,不会产生这样的成本,并且许可证(PD、BSD、MIT)非常宽松。您最多可能需要在您的应用程序中提供许可证详细信息,例如使用 mingw64-tdm 时所需的 winpthreads 许可证。

编辑感谢 Izzy Helianthus:商业许可证不再可用或不再需要,因为在 Cygwin 的 winsup 子目录中找到的 API 库现在在 LGPL 下分发,而不是完整的 GPL。

于 2015-09-18T12:32:16.763 回答
9

请注意,实用程序行为可能在两者之间真正有所不同。

例如,Cygwin tar 可以分叉——因为 DLL 支持 fork()——而 mingw 版本不能。这是尝试从源代码编译 mysql 时出现的问题。

于 2009-04-21T09:23:24.537 回答
7

Cygwin 旨在为 Windows 提供或多或少完整的 POSIX 环境,包括旨在提供成熟的类 Linux 平台的广泛工具集。相比之下,MinGW 和 MSYS 提供了一个轻量级、极简的类似 POSIX 的层,只有更重要的类似gccbash可用的工具。由于 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 代码可以在开源和闭源应用程序中使用,因为标头和库是许可许可的。

于 2014-03-06T04:19:18.250 回答
3

Cygwin是用于 Microsoft Windows 的类 Unix 环境和命令行界面。

Mingw是 GNU 编译器集合 (GCC) 到 Microsoft Windows 的本机软件端口,以及一组可免费分发的导入库和用于 Windows API 的头文件。MinGW 允许开发人员创建本地 Microsoft Windows 应用程序。

mingw您可以在没有环境的情况下运行生成的二进制文件cygwin,前提是所有必要的库 (DLL) 都存在。

于 2009-04-21T09:21:41.870 回答
3

Cygwin使用兼容层,MinGW而是原生的。这是主要区别之一。

于 2014-02-27T23:37:48.470 回答
3
   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
于 2020-10-01T17:14:56.680 回答