几个问题:
-
是正确的理解,MinGW本质上是采取gcc源代码,并将其编译成一个可执行的windows,即gcc.exe?
-
MinGW wiki说"另一方面,MinGW提供了由Win32 API提供的功能。"这让我很困惑。默认情况下,Windows安装不已经提供了公开Win32 API的Win32 API头,这将使MinGW再次提供它冗余吗?MinGW提供的头文件与Windows安装自带的头文件不同吗?
-
当我有一个由MinGW gcc编译的对象文件时,我可以将它链接到windows上的C运行时库吗?我不这么认为,因为MinGW gcc生成的目标文件可能与windows上的C运行时库不兼容(比如使用相同的调用约定)。
-
GCC是一个多平台编译器,所以这个编译器有Linux版本,MacOS版本,Windows版本。"MinGW GCC"是现有的至少两个Windows版本之一。"MinGW系统"不过是一些GNU工具的Windows版本的集合。
-
我刚刚阅读了MinGW Wiki条目和"由Win32 API提供"似乎澄清了"Cygwin"one_answers"MinGW"之间的区别-而不是"MinGW"和微软C编译器之间的区别:
对于许多GNU工具,有两个不同的版本可用于Windows: "Cygwin"one_answers"MinGW"。
"Cygwin"使用一个特殊的仿真环境来模拟类unix文件系统。一个特殊的库将被链接到程序中,其中像"fopen"这样的函数将把"/home/mydir/myfile.txt"格式的文件名转换为"c:programscygwinhomemydirmyfile.txt"格式的文件名。
使用"Cygwin"编译器,"gcc"命令行和由它创建的程序的命令行(更确切地说:链接)都需要类似unix的文件名。
然而,"MinGW"工具的行为与其他Windows程序一样,并使用普通的Windows库,其中像"fopen"这样的函数期望"正常"的类似Windows的文件名,如"c:somedirsomefile"。由"MinGW" GCC编译器构建的程序的行为类似于由Microsoft编译器构建的程序。
与Linux不同,Windows不附带任何头文件,但它们带有Win32 API,必须从微软下载(> 1GiB)。MinGW和Cygwin提供了一些自己的头文件,这些头文件几乎与微软的头文件兼容,所以不需要下载Win32 API。
-
Windows中的大多数开发工具使用相同的对象和静态库文件格式。("Watcom"编译器是少数例外之一。)这意味着您可以混合使用不同编译器编译的对象和静态库文件。(.lib/. xml文件的格式。用于动态链接dll的存根库在gcc和Microsoft之间是不同的,所以你不能混合使用它们!)
关于对另一个答案的评论:
- MinGW通常链接到Windows自带的"msvcrt.dll"。这个文件包含像"printf()"这样的标准C函数。
- Microsoft Visual c++有时链接到"msvcr100.dll",有时链接到"msvcr100.dll"。"msvcr100.dll"也包含标准的C函数,但其中一些具有增强的功能(例如Unicode…)。"msvcr100.dll"必须是后安装的,因为它不是Windows自带的。
- Cygwin链接到像"cygwin1.dll"这样的文件,其中包含标准C函数的Cygwin变体(文件名处理不同)。不用说,这个文件不是Windows自带的,而是必须在安装后安装的。
与Linux中的"libc"不同,所有这些dll都不直接调用操作系统,但它们调用"kernel32.dll",其中包含低级函数(如"WriteFile()"),这些函数将调用操作系统。
-
"gcc source"是什么意思?当您说"gcc源代码"时,您可能指的是"gcc编译器的源代码"。MinGW是一个windows版本的GCC,所以它可以使用任何C源代码并生成可执行文件,而且它是GCC,所以它具有该编译器的功能。
-
我认为微软提供的头文件(例如windows.h和winusb.h)实际上与GCC不兼容。MinGW项目包括与GCC兼容的头文件,因此您可以从程序中调用
ReadFile
等Windows函数。上次我检查的时候,MinGW只有一些微软的头文件; -
为什么要链接Windows运行库?我知道跨编译器互操作是可能的,因为我曾经用Microsoft C编译器编写了一个DLL,并从MinGW (Qt)程序调用它。