编译器库与操作系统库

Compiler Libraries vs. Operating System Libraries

本文关键字:操作系统 系统库 操作 编译器      更新时间:2023-10-16

我注意到我的编译器(MinGW)和Windows 8 SDK都带有相同的库,保存命名约定(即Windows 8 SDK上的win32.lib是MinGW库中的libwin32.a)。

    所有的编译器都有这样的库吗?
  • 这些库适用于多个操作系统吗?
  • Windows 8 SDK自带的库和编译器自带的库之间有什么区别(如果有的话)?

有两种库:

  • 导入库:
    这些库只列出了在哪里可以找到对变量/函数等的引用。,但是它们不包含代码本身。

  • "Normal"库(包含包含机器码的目标文件):
    这些库包含对象文件,其中包含实际的机器码。

操作系统附带的库通常是导入库。
毕竟,实际的代码在操作系统本身中;导入库只是告诉您如何使用操作系统中提供的代码。
为什么这是必要的?因为程序在运行时无法"发现"操作系统上可用的库,所以程序必须知道编译时将可用的

编译器自带的通常是代码库;它们包含编译器需要的代码(这取决于你的特定编译器),以完成你的程序。

然而,库没有单一的"标准格式";Microsoft使用COFF,而*nix工具使用ELF。
因此,当微软为一个系统提供导入库时,它只提供COFF格式的库,这对Visual c++编译器很好,但对其他编译器不是很有用。

这导致像MinGW这样的编译器供应商被迫为他们打算瞄准的操作系统创建他们自己的导入库——这些库的目的与操作系统供应商(如Microsoft)提供的完全相同,但是它们的格式不同。

MinGW自带一套SDK库,原因很简单,MinGW打算提供一个可以生成Windows程序的免费编译器实现,但是Windows SDK在MinGW开发人员想要/需要的意义上不是免费提供的。由于Microsoft Windows SDK的许可,它不能简单地与MinGW编译器一起发布。因此,MinGW开发工作的一个重要部分是一组提供Windows SDK功能而不违反微软许可条款的头文件和库。

相当一部分MinGW WinSDK是公共领域(甚至可能是大部分或全部)。所有这些都是免费分发的开源软件。

使用MS目标文件和库的MinGW也可能存在兼容性问题,但我惊讶地发现MinGW经常可以链接到MS编译器生成的目标文件和库(尽管我不确定是否有任何保证它被支持)。

一个相关的问题是MinGW严重依赖于微软提供的msvcrt.dll C运行时DLL。但是DLL不是由MinGW分发的——它是每个Windows操作系统的一部分,所以MinGW依赖于它只是作为一个基本的操作系统设施存在。