2014-07-10 55 views
6

几个问题:从技术POV来看,MinGW的功能是什么让gcc可以在windows上运行?

  1. 是否正确理解MinGW的基本上走的是gcc的源和它编译成可执行的窗口,即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运行时库不兼容(就像使用相同的调用约定)。

+0

这更像是他们在Win32上提供类似Linux的包装。然后,头文件需要更像Linux头文件,而实现将实际调用到Win32 API中。 –

+0

(1)是的。 (2)MinGW仅提供* Win32 API提供的功能,与Cygwin相反,它在Windows之上提供了一个类似Unix的仿真层。 (3)MinGW支持Windows内置C运行时使用的调用约定,因此您可以链接到它;但请注意,Microsoft不支持第三方使用内置运行时,所以不能保证它可以可靠地工作(尽管实际上它大部分都是这样)。 –

+0

问:默认情况下,Windows安装不会提供Win32 API标头。答:不可以。Windows头文件和库分开安装。使用Windows SDK。或者使用Windows编译器,如MSVS ...或MinGW。 – FoggyDay

回答

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

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

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

+0

的首页上说的是这样1.我的意思是GCC的源代码,当编译时提供gcc.exe。 2.为什么它们不兼容GCC?它们是否只有VC编译器可以使用的不符合C代码?如果是这样,那么重写窗口api标题就成了一件不容忽视的任务,因此它们可以成为gcc的一部分。 – igbgotiz

+0

3.因为windows运行时库提供了printf,进程和对于任何非平凡程序都很重要的东西。我还会去哪里获得printf? – igbgotiz

+0

@igbgotiz:Windows SDK提供的头文件支持各种编译器,但我的理解是MinGW不是其中之一。这些头文件必须能够声明特定大小的类型(这需要编译器的知识),并且必须能够为函数声明调用约定(这需要编译器特定的扩展名)。如果您对好奇差异感到好奇,您可以自己比较MinGW头和MS头。 –

2
  1. GCC是一个多平台的编译器,有一个版本的Linux,MacOS的版本,该编译器的Windows版本。 “MinGW GCC”是现有的至少两个Windows版本之一。 “MinGW系统”不过是一些GNU工具的Windows版本的集合。

  2. 我刚才读MinGW的维基条目和“由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程序类似,并且使用像“fopen”这样的函数需要像“c:\ somedir \ somefile”这样的“正常”Windows类文件名的正常Windows库。由“MinGW”GCC编译器构建的程序的行为与Microsoft编译器构建的程序相似。

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

  3. Windows中的大多数开发工具都使用相同的对象和静态库文件格式。 (“Watcom”编译器是少数几个例外之一。)这意味着您可以混合使用不同编译器编译的对象和静态库文件。 (.LIB格式/用于针对的DLL动态链接.A存根库gcc和微软之间是不同的,所以你不能混用他们!)

关于其他答案的评论:

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

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

+0

请注意,Microsoft Visual C++自VS6以来就没有使用msvcrt.dll,因为它很早就不受支持。所有当前版本的VS都带有自己的C运行时,并且不支持使用msvcrt.dll。 (这并不一定意味着你不能这样做,它只是不被支持。)MinGW的msvcrt.dll的使用也不支持AFAIK,尽管在实践中似乎大多数工作。 –

相关问题