简单解释一下啥是MinGW

Posted

技术标签:

【中文标题】简单解释一下啥是MinGW【英文标题】:A simple explanation of what is MinGW简单解释一下什么是MinGW 【发布时间】:2011-12-09 01:39:04 【问题描述】:

我是一个***的 Python 用户,我似乎需要在我的 Windows 机器上安装 MinGW 来编译一些库。我对 MinGW 和 GCC 有点困惑。这是我的问题(从一个真正的假人的角度来看):

所以 Python 是一种既可解释又可编译的语言。有 Python 的 Linux 和 Windows 实现,只需安装并使用二进制文件来执行他的代码。它们捆绑了一堆您可以使用的内置库。从我读过的内容来看,Ruby 也是如此。

现在,我已经完成了一点点 C 语言,我知道有一个可以编译它。它有它的内置库,这些库似乎被称为您可以使用的头文件。现在,回到学校时代,C 正在一个名为 Turbo-C 的类似 vi 的 IDE 中编写代码,然后按 F9 进行编译。这就是我的 C 教育结束的地方。

什么是MinGW,什么是GCC?我一直主要在 Windows 系统上工作,甚至最近开始使用 Cygwin。它们不一样吗?

针对这些领域的简单解释会有所帮助。

(如果这篇文章听起来很愚蠢/愚蠢,我深表歉意。我想我会在这里问。忽略这些核心位永远不会让任何人成为更好的程序员。)

谢谢大家。

【问题讨论】:

您是否阅读了 www.mingw.org 上的欢迎页面?它是否为您回答了任何问题,或者提出了新的、更具体的问题?您可能还想阅读一些关于编译器/编译语言如何工作的介绍性信息。 【参考方案1】:

MinGW 是一个完整的 GCC 工具链(包括六个前端,如 C、C++、Ada、Go 等),用于 Windows 平台,它编译并链接到 msvcrt.dll 中的 Windows 操作系统组件 C 运行时库.相反,它试图最小(因此得名)。

这意味着,与 Cygwin 不同,MinGW 尝试在 Windows 之上提供完整的 POSIX 层,但另一方面,它不需要您链接特殊的兼容性库。 因此,它对您编写的程序有任何 GPL 许可含义(值得注意的例外:分析库,但您通常不会分发这些库,所以这无关紧要)。

较新的 MinGW-w64 带有大约 99% 的完整 Windows API 绑定(不包括 ATL 等),包括 x64 支持和实验性 ARM 实现。您可能偶尔会发现一些奇异的常量 undefined,但对于 99% 的人在 99% 的时间里使用,它运行得非常好。

您也可以使用 POSIX 中的大部分内容,只要它在 Windows 下以某种形式实现即可。一个不适用于 MinGW 的主要 POSIX 东西是 fork,仅仅是因为在 Windows 下没有这样的东西(Cygwin 经历了很多痛苦来实现它)。 还有一些其他的小事,但总而言之,大多数事情还是可以的。

所以,用一个非常简单的句子来说:MinGW(-w64) 是一个“简洁的编译器”,它让您可以为 Windows 编写本机二进制可执行文件,不仅可以使用 C 和 C++,还可以使用其他语言。

【讨论】:

你知道 MinGW 的 -w64 分支背后的历史以及为什么他们如此不方便地选择称它为“w64”吗? 什么是编程语言的“前端”? @Nim:编程语言的前端,或多或少。编译器通常/通常由前端(例如 C 或 C++)组成,前端被解析为抽象语法树并转换为某种未指定的中间表示。然后,该中间表示由后端转换为特定于机器数量的指令。一些编译器 (LLVM) 使这一点更加明确,而另一些则使其不那么明确,但原则上它们的工作原理相同。 "...编译并链接到 msvcrt.dll 中的 Windows 操作系统组件 C 运行时库..." - 我认为 MingW 不依赖 @987654323 @,而是带有自己的标准库.dll。我错了吗? 什么是“GCC”?【参考方案2】:

MinGW 存在的唯一原因是为无法使用原生 windows 工具的开发人员提供类似 linux 的环境。它在几乎所有方面都不如 Win32/Win64 平台上的 Microsoft 工具链,但它提供了 linux 开发人员无需学习任何新东西并且他/她几乎无需修改即可编译 linux 代码的环境。这是一个值得商榷的方法,但很多人发现便利性比开发的其他方面更重要。 正如前面的答案中所指出的,它与 C 或 C++ 无关,它与开发人员想要的环境有关。关于 Windows 上的 GNU 工具链及其本质的争论就是这样 - 一个争论

GCC - unix/linux 编译器, MinGW - Windows 环境下 GCC 的近似值, Microsoft 编译器和 Intel 编译器 - 与名称所暗示的更多相同(两者都在 Windows 上生成比 MinGW 更好的程序,顺便说一句)

【讨论】:

@rubenvb - 请赐教 MinGW 不提供类似 linux 的环境,即 MSYS(2) 和/或 Cygwin。 MinGW 提供了头​​文件和库,以便可以针对 Windows C 运行时构建和使用 GCC(编译器套件,而不仅仅是“unix/linux 编译器”)。它提供了零星的扩展,主要是在 C 和/或 C++ 标准需要在 Windows 版本的 C 库中未实现的附加功能的情况下(目前认为是 C11)。 MinGW 不是 Windows 上 GCC 的“近似值”。它的功能相当完整。它存在的原因不再适合这个小盒子了。 @rubenvb 它提供了什么 c++ 11(或 14)功能,而 MS 编译器没有?你有没有遇到过在没有 Cygwin 的情况下使用 MinGW 的情况?您需要在 Windows 上使用命名头文件的原因是什么,它与我所说的有什么矛盾?作为一个在 Windows、Linux 和 Mac 上进行 NATIVE 开发的人,我真的非常非常好奇 - 10 年左右,我还没有听到一个全面的答案 在 VS2015 之前(甚至在当前的 VS2015 中,请参阅 here),在 GCC 和 Clang 都具有正确实现的情况下,有很多东西缺失或实现不当。 VS 通常在标准一致性方面落后。自从 GCC 4.7 出现以来,情况就是如此。我(例如 Qt Open Source)使用没有 Cygwin 的 MinGW-w64。我不明白您所说的“命名头文件”是什么意思。带有 MinGW-w64 的 GCC 只是 Windows 上的另一个编译器,因此非常有用,不受 VS 附带的任何许可限制。 "MinGW 提供标头标头和库以便 GCC" - 这就是我的意思。在 C++ 合规性方面,我已得到纠正——我自己并不关心它(尤其是 C++14)。我应该写的是“linux 开发人员、c++14/17 的小伙伴和喜欢过于复杂的开发方式的人”——谢谢你的纠正。 MSVC 的许可限制-我不熟悉它们,使用社区版您几乎可以编译 VS 之外的所有内容(这只是一个 IDE)【参考方案3】:

要编译 C 程序,您需要针对特定​​计算机的 C 实现

C 实现基本上由一个编译器(它的预处理器和头文件)和一个库(现成的可执行代码)组成。

在安装了 Windows 的计算机上,包含大多数现成可执行代码的库与 gcc 编译器不兼容...所以要在 Windows 中使用此编译器,您需要一个不同的库:这是 MinGW 进入的地方. MinGWgcc 一起提供了制作 C 实现所需的库。


Windows 库和 MSVC 共同实现了不同的实现。

【讨论】:

好简单的解释。 @pmg 所以库代码与 gcc 编译器不兼容,但我们在int main() 中编写的所有代码都与 gcc 编译器兼容,对吗? 在头文件声明中,在库文件中定义。所以编译链接器在目标文件中关联各自的现成代码。这只是您指的是包含大多数现成可执行代码的库对吗?但是这发生在编译之后,为什么它是 gcc 编译器的问题?我想我缺少一些基本知识但我不明白? 不太正确...(部分)标准库随操作系统一起安装(我 3 岁的侄女电脑内置了该功能)。当您安装编译器(带有头文件和 [额外] 标准库现成函数)时,编译器和标准库的操作系统部分之间的连接大部分已经很好地建立. MinGW 只是说:“不要与操作系统功能链接,而是使用这些功能”。【参考方案4】:

MinGW 是大多数 GNU 构建实用程序的实现,例如 Windows 上的 gcc 和 make,而 gcc 只是编译器。 Cygwin 是一个更大更复杂的软件包,它的安装量比 MinGW 多得多。

【讨论】:

【参考方案5】:

MinGW 是一套包含 GCC(以及其他)的开发工具,而 GCC 是该套件中的 C 编译器。

【讨论】:

又是一套可与MinGW媲美的类Unix工具。 @Mr.32 来自***:Cygwin 是一个类似 Unix 的环境和 Microsoft Windows 的命令行界面。

以上是关于简单解释一下啥是MinGW的主要内容,如果未能解决你的问题,请参考以下文章

解释一下啥是二值化?

Xcode:啥是简单语言的目标和方案?

有人可以解释一下啥是受保护的覆盖无效吗? [复制]

C++中啥是容器?可不可以具体解释一下

MinGW 安装与简单实例

解释一下啥是MVC,IOC,AOP,ORM,JNDI,,Hibernate,SSO、Portal