我注意到我的编译器( MinGW )和 Windows 8 SDK 都带有相同的库,保存了命名约定(即win32.lib
Windows 8 SDK在MinGW库中为libwin32.a
。
答案 0 :(得分:7)
有两种库:
导入库:
这些库只列出了在哪里可以找到对变量/函数/等的引用,但是它们不包含代码本身。
“普通”库(包含包含机器代码的目标文件):
这些库包含目标文件,其中包含实际的机器代码。
操作系统附带的库通常是导入库 毕竟,实际的代码是在操作系统本身;导入库只是告诉您如何使用操作系统中提供的代码 为什么这有必要?因为程序无法在运行的情况下“发现”操作系统上可用的库,所以程序必须知道可用的 >编译时。
编译器附带的通常是代码库;它们包含编译器所需的代码(具体取决于您的特定编译器),以便完善您的程序。
然而,图书馆没有单一的“标准格式”; Microsoft使用COFF,但* nix工具使用ELF 因此,当微软为系统提供导入库时,它只会以COFF格式发送它们,这对于Visual C ++编译器来说非常有用 - 但对其他编译器却没那么有用。
这会导致像MinGW这样的编译器供应商被迫为他们想要定位的操作系统创建自己的导入库 - 这些库的目的是与操作系统供应商(如Microsoft)提供的完全相同,但它们的格式是不同的。
这就是为什么你会看到以多种方式提供看似相似的库。
答案 1 :(得分:2)
MinGW附带了自己的SDK库,原因很简单,MinGW旨在提供可以生成Windows程序的免费编译器实现,但是从MinGW开发人员想要的意义上来说,Windows SDK并不是免费提供的。需要。由于Microsoft Windows SDK上的许可证,它不能简单地与MinGW编译器一起分发。因此,MinGW开发工作的一个重要部分是提供Windows SDK功能的一组头文件和库,而不会侵犯Microsoft的许可条款。
相当一部分MinGW WinSDK是公共领域(甚至可能是大部分或全部)。所有这些都是可自由分发的开源。
MinGW使用MS目标文件和库时可能存在兼容性问题,但我很惊讶地发现MinGW经常可以链接到MS编译器生成的目标文件和库(虽然我不确定是否有任何保证支持它。)
相关问题是MinGW严重依赖Microsoft提供的msvcrt.dll C运行时DLL。但是这个DLL不是由MinGW分发的 - 它是每个Windows操作系统的一部分,所以MinGW依赖于它只是作为一个基本操作系统设施。