Avi*_*ohn 5 c include libraries
我正在学习 C 中的静态和动态库以及如何制作它们。
一直困扰我的一件事是:
假设一个文件mylibrary通过执行#include <mylibrary.h>.
这是否意味着 C 库与匹配的文本头文件一起分发?或者mylibrary.h以某种方式从二进制库文件中神奇地导出?
这是否因不同的方法而异,或者库是静态的还是动态的?
是的,根据平台的不同,您可以获得更多的文件来分发。这是一个相当混乱的故事。至少,库是静态的还是动态的(除了链接器参数之外)并不重要。
头文件是必需的,因为编译后的二进制文件不包含编译器可用的足够信息。由于存在一些基于平台的差异,C 二进制文件通常仅具有足够的元数据来通过名称来识别函数和全局变量。该元数据不包括参数的类型(或计数)、返回类型、结构或联合定义、全局变量的类型或大小等。所有这些信息通常都编码在随库分发的标头中。(方便的是,这也意味着标头中不存在的任何内容对开发人员都是隐藏的;这允许您在库中创建非公共函数,用户不应直接调用这些函数。)
在某些平台上,二进制文件甚至不包含函数名称。相反,函数是通过它们在“序数表”中的位置来引用的。在这些平台上,库必须提供标头、可执行二进制文件和一个附加文件,该文件从标头中的函数名称转换为序数表中函数的索引,例如“void hello(void)对于链接器来说," 可能是“序数表中索引 3 处的函数”。
相反,包含标头(通常)不会链接到它附带的库。这在某些平台上是可能的,例如 Windows,在该平台上,您可以将特殊的编译器指令放入标头中,并告诉链接器链接到某些库,但这不是标准行为,您不能期望它是在任何其他平台上都是现实。
即将推出的模块可以为链接二进制文件提供更好的用户体验。模块是另一个可以与二进制文件一起打包的文件,它表示“这是我所有的标头,这是我所有的库”。使用模块,可以编写类似“import MyLibrary;”的内容 它会为您提供所需的所有标头和所有链接器参数。我相信还没有 C 标准模块;C++ 正在通过 C++20 实现这一目标。