GCC 是一个多平台编译器,因此该编译器有 Linux 版本、MacOS 版本、Windows 版本。“MinGW GCC”是现有的至少两个 Windows 版本之一。“MinGW 系统”不过是一些 GNU 工具的 Windows 版本的集合。
我刚刚阅读了 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。
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()”)。