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