6

几个问题:

  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 运行时库不兼容(比如使用相同的调用约定)。

4

2 回答 2

2
  1. “gcc 源”是什么意思?当您说“gcc 源代码”时,您可能指的是“GCC 编译器的源代码”。MinGW 是 GCC 的 windows 版本,因此它可以获取任何 C 源代码并生成可执行文件,并且它是 GCC,因此它具有该编译器的功能。

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

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

于 2014-07-10T04:22:59.020 回答
2
  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”等文件名。文本”。

    使用“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()”)。

于 2014-07-10T09:04:09.033 回答