【问题标题】:From a technical POV, what is it that MinGW does that makes gcc possible on windows?从技术 POV 来看,MinGW 做了什么让 gcc 在 Windows 上成为可能?
【发布时间】:2014-08-31 08:19:31
【问题描述】:

几个问题:

  1. 理解 MinGW 本质上是获取 gcc 源并将其编译为 Windows 的可执行文件(即 gcc.exe)是否正确?

  2. MinGW wiki 说“另一方面,MinGW 提供由 Win32 API 提供的功能。”。这让我很困惑。默认情况下,Windows 安装是否已经提供了暴露 Win32 API 的 Win32 API 标头,这会使 MinGW 再次提供它变得多余? MinGW 提供的标头是否与 Windows 安装随附的标头不同?

  3. 当我有一个由 MinGW gcc 编译的目标文件时,我可以将它链接到 windows 上的 C 运行时库吗?我认为不是因为 MinGW gcc 生成的目标文件可能与 windows 上的 C 运行时库不兼容(比如使用相同的调用约定)。

【问题讨论】:

  • 这更像是他们提供了类似 Linux 的 Win32 包装器。因此,标头需要更像 Linux 标头,而实现实际上会调用 Win32 API。
  • (1) 是的。 (2) MinGW提供 Win32 API 提供的功能,与 Cygwin 不同,后者在 Windows 之上提供了一个类 Unix 的仿真层。 (3)MinGW支持Windows内置C运行时使用的调用约定,所以可以链接到它;但是请注意,Microsoft 不支持第三方使用内置运行时,因此无法保证它会可靠地工作(尽管实际上它大部分都可以)。
  • 问:默认情况下,Windows 安装是否已经提供了 Win32 API 标头。 A: 不会。windows 头文件和库是分开安装的。使用 Windows SDK。或者使用 MSVS ... 或 MinGW 等 Windows 编译器。
  • WRT 3,Windows 上没有标准的“C 运行时库”。 MSVC 运行时与操作系统分开安装!
  • @duskwulf:MinGW 使用“C 运行时库”MSVCRT.DLL,它作为操作系统组件与最新版本的 Windows 一起分发。

标签: c winapi gcc mingw microsoft-runtime-library


【解决方案1】:
  1. GCC 是一个多平台编译器,因此该编译器有 Linux 版本、MacOS 版本和 Windows 版本。 “MinGW GCC”是现有的至少两个 Windows 版本之一。 “MinGW 系统”不过是一些 GNU 工具的 Windows 版本的集合。

  2. 我刚刚阅读了 MinGW Wiki 条目,“由 Win32 API 提供”似乎阐明了“Cygwin”和“MinGW”之间的区别——而不是“MinGW”和 Microsoft C 编译器之间的区别:

    对于许多 GNU 工具,有两个适用于 Windows 的不同版本:“Cygwin”和“MinGW”。

    “Cygwin”使用特殊的仿真环境来仿真类 Unix 文件系统。一个特殊的库将链接到程序,其中“fopen”等函数会将“/home/mydir/myfile.txt”形式的文件名转换为“c:\programs\cygwin\home\mydir\myfile”等文件名。 txt”。

    使用“Cygwin”编译器,“gcc”命令行和由它创建(更准确地说:链接)的程序的命令行都需要类似 Unix 的文件名。

    然而,“MinGW”工具的行为与其他 Windows 程序一样,并使用普通的 Windows 库,其中“fopen”等函数需要“普通”类似 Windows 的文件名,如“c:\somedir\somefile”。由“MinGW”GCC 编译器构建的程序的行为类似于由 Microsoft 编译器构建的程序。

    与 Linux 不同,Windows 不附带任何头文件,但它们带有必须从 Microsoft 下载 (> 1GiB) 的 Win32 API。 MinGW 和 Cygwin 提供了一些自己的头文件,几乎与 Microsoft 的兼容,因此无需下载 Win32 API。

  3. Windows 中的大多数开发工具都使用相同的对象和静态库文件格式。 (“Watcom”编译器是少数例外之一。)这意味着您可以混合使用不同编译器编译的对象和静态库文件。 (用于动态链接 DLL 的 .lib/.a 存根库的格式在 gcc 和 Microsoft 之间有所不同,因此您不能混合使用它们!)

关于对另一个答案的评论:

  • MinGW 通常链接到 Windows 附带的“msvcrt.dll”。该文件包含标准 C 函数,例如“printf()”。
  • Microsoft Visual C++ 有时会链接到“msvcrt.dll”,有时会链接到某些 DLL,例如“msvcr100.dll”。 “msvcr100.dll”还包含标准 C 函数,但其​​中一些具有增强的功能(例如 Unicode...)。 “msvcr100.dll”必须后安装,因为它不随 Windows 提供。
  • Cygwin 链接到诸如“cygwin1.dll”之类的文件,其中包含标准 C 函数的 Cygwin 变体(文件名处理不同)。不用说,此文件不随 Windows 提供,但必须后安装。

与 Linux 中的“libc”不同,所有这些 DLL 并不直接调用操作系统,而是调用“kernel32.dll”,其中包含将调用操作系统的低级函数(如“WriteFile()”)。

【讨论】:

  • 请注意,Microsoft Visual C++ 自 VS6 以来就没有使用过 msvcrt.dll,这早已不被支持。所有当前版本的 VS 都带有自己的 C 运行时,并且不支持使用 msvcrt.dll。 (这并不一定意味着你不能这样做,它只是不受支持。) AFAIK 也不支持 MinGW 对 msvcrt.dll 的使用,尽管在实践中它似乎主要工作。
【解决方案2】:
  1. “gcc 源”是什么意思?当您说“gcc 源代码”时,您可能指的是“GCC 编译器的源代码”。 MinGW 是 GCC 的 windows 版本,因此它接受任何 C 源代码并生成可执行文件,它是 GCC,因此具有该编译器的功能。

  2. 我认为微软提供的头文件(例如 windows.h 和 winusb.h)实际上与 GCC 不兼容。 MinGW 项目包含与 GCC 兼容的头文件,因此您可以从程序中调用 Windows 函数,例如 ReadFile。上次查看时,MinGW 只有一些微软的头文件;它缺少 winusb.h。

  3. 为什么要链接到 Windows 运行时库?我知道交叉编译器互操作是可能的,因为我曾经用 Microsoft C 编译器编写了一个 DLL,并从 MinGW (Qt) 程序中调用它。

【讨论】:

  • 1.我的意思是 GCC 的源代码,它在编译时会给出 gcc.exe。 2. 为什么不兼容GCC?它们是只有 VC 编译器才能使用的不符合标准的 C 代码吗?如果是这样,那么重写 windows api 标头使它们成为 gcc 的可馈送将成为一项不平凡的任务。
  • 3.因为 Windows 运行时库提供了 printf、进程和任何重要程序都必不可少的东西。我还能在哪里获得 printf?
  • @igbgotiz:Windows SDK提供的头文件支持多种编译器,但我的理解是MinGW不是其中之一。这些头文件必须能够声明特定大小的类型(这需要编译器的知识),并且还必须能够声明函数的调用约定(这需要编译器特定的扩展)。如果您对确切的差异感到好奇,您可以自己将 MinGW 标头与 MS 标头进行比较。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
相关资源
最近更新 更多