C 库是否随二进制文件一起分发了文本头文件?

Are C libraries distributed with textual header files along with the binary files?

我正在学习 C 中的静态库和动态库以及如何制作它们。

一直困扰我的一件事是:

假设一个文件正在通过 #include <mylibrary.h>.

使用库 mylibrary

这是否意味着 C 库与匹配的 textual 头文件一起分发?还是 mylibrary.h 以某种方式神奇地从二进制库文件中导出?

这是否因不同的方法而异,或者库是静态的还是动态的?

是的,根据平台的不同,您可以使用它分发更多文件。这是一个相当混乱的故事。至少,库是静态的还是动态的并不重要(除了 linker 参数)。

header 文件是必需的,因为编译后的二进制文件不包含足够的信息供编译器使用。由于存在一些 platform-based 差异,C 二进制文件通常只有足够的元数据来通过名称识别函数和全局变量。该元数据不包括参数的类型(或数量)、return 类型、结构或联合定义、全局变量的类型或大小等。所有这些信息通常都编码在 header与图书馆一起分发的。 (方便的是,这也意味着 header 中不存在的任何内容都对开发人员隐藏;这就是允许您在库中创建 non-public 函数的原因,用户不应直接调用这些函数。 )

在某些平台上,二进制文件甚至不包含函数名称。相反,函数是通过它们在 "ordinal table" 中的位置来引用的。在这些平台上,该库必须提供一个 header、executable 二进制文件,以及一个将 header 中的函数名称转换为函数索引的附加文件在序数 table 中,这样 "void hello(void)" 可能是 "function at index 3 in ordinal table" 到 linker.

相反,包含 header 不会(通常)link 反对它附带的库。这在某些平台上是可能的,例如 Windows,在该平台上有特殊的编译器指令,您可以将其放入 header 并告诉 linker link 反对某些库,但这不是标准行为,您不能指望它在任何其他平台上成为现实。

即将推出的是模块,它们为 link 二进制文件提供了更好的用户体验。模块是另一个文件,您可以将其与二进制文件一起打包,并表示 "here are all my headers and here are all my libraries"。使用模块,可以编写类似 "import MyLibrary;" 的内容,它会为您提供所有 header 和您需要的所有 linker 参数。我相信还没有 C-standard 个模块; C++ 正在通过 C++20 实现这一目标。