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

问题描述 投票:3回答:1

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

一直困扰着我的是:

假设一个文件通过mylibrary使用库#include <mylibrary.h>

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

这在不同方法之间是否有所不同,或者库是静态的还是动态的?

c include libraries
1个回答
1
投票

是的,根据平台的不同,您可以获得更多文件。这是一个非常混乱的故事。至少,库是静态的还是动态的(与链接器参数不同)并不重要。

头文件是必需的,因为编译的二进制文件不包含足以供编译器使用的信息。通过一些基于平台的方差,C二进制文件通常只有足够的元数据来按名称标识函数和全局变量。该元数据不包括参数的类型(或计数),返回类型,结构或联合定义,全局变量的类型或大小等。所有这些信息通常都编码在随库分发的头中。 (方便的是,它还意味着标题中不存在的任何内容对开发人员是隐藏的;这使您可以在库中创建非公共函数,用户不应直接调用。)

一些平台,二进制文件甚至不包含函数名称。相反,函数由它们在“序数表”中的位置引用。在这些平台上,库必须提供一个标头,可执行二进制文件和一个附加文件,该文件从标头中的函数名称转换为序数表中函数的索引,这样“void hello(void) “可能是”在序列表中的索引3处对链接器起作用。

相反,包括标题不会(通常)链接到它所伴随的库。这在某些平台上是可行的,比如Windows,在这个平台上有一些特殊的编译器指令可以放在一个头文件中,并告诉链接器链接某个库,但它不是标准行为,你不能指望它是在任何其他平台上实现。

即将推出的模块可以提供更好的用户体验来链接二进制文件。一个模块是另一个文件,您可以使用您的二进制文件打包,并说“这里是我的所有标题,这里是我的所有库”。使用模块,可以编写类似“import MyLibrary”的内容。它将为您提供所需的所有标题和所有链接器参数。我相信还没有C标准模块; C ++正在实现C ++ 20。

© www.soinside.com 2019 - 2024. All rights reserved.