协慌网

登录 贡献 社区

Cygwin 和 MinGW 有什么区别?

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

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

答案

为简化起见,它是这样的:

  • 在 Cygwin 中编译某些内容,而您正在为 Cygwin进行编译。

  • 在 MinGW 中编译某些内容,并且您正在为 Windows进行编译。

关于西格温

Cygwin 是一个兼容层,通过模拟基于 Unix 的操作系统提供的许多基本接口(例如管道,Unix 风格的文件和目录访问等),可以轻松地将基于 Unix 的简单应用程序移植到 Windows。由POSIX标准记录。如果您已有使用这些接口的源代码,则只需很少甚至不做任何更改,便可以将其编译为与 Cygwin 一起使用,从而大大简化了将简单的基于 IO 的 Unix 代码移植到 Windows 上的过程。

分发软件时,收件人将需要与 Cygwin 运行时环境(由文件cygwin1.dll )一起运行。您可以将其与软件一起分发,但是您的软件必须遵守其开放源代码许可。即使只是将您的软件与其链接在一起,但单独分发 dll,仍然可以对您的代码施加许可证限制。

关于 MinGW

MinGW 的目标只是成为 Windows 的 GNU 开发工具的一部分。它不尝试模拟 Unix 或提供与 Unix 的全面兼容性,而是提供可以在 Windows 中本地使用的 GNU 编译器集合,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 编译器和工具对其进行编译。

Cygwin 试图在 Windows 上创建完整的 UNIX / POSIX 环境。为此,它使用各种 DLL。虽然这些 DLL 包含在 GPLv3 + 中,但它们的许可证包含一个例外,该例外不会强制将衍生的作品包含在 GPLv3 + 中。 MinGW 是 C / C ++ 编译器套件,可让您创建 Windows 可执行文件,而无需依赖此类 DLL - 您仅需要正常的 MSVC 运行时,这是任何正常的 Microsoft Windows 安装的一部分。

您还可以获得一个类似于 UNIX / POSIX 的小型环境,该环境是使用 MinGW 编译的,名为MSYS 。它不具有 Cygwin 的所有功能,但是对于希望使用 MinGW 的程序员来说是理想的选择。

为了增加其他答案,Cygwin 附带了 MinGW 库和标头,您可以通过在 gcc 中使用 - mno-cygwin 标志来进行编译而无需链接到 cygwin1.dll。我非常喜欢此方法,而不是使用普通的 MinGW 和 MSYS。