gpt4 book ai didi

c - C 库是否与文本头文件以及二进制文件一起分发?

转载 作者:行者123 更新时间:2023-12-02 02:45:06 31 4
gpt4 key购买 nike

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

一直困扰我的一件事是:

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

这是否意味着 C 库与匹配的文本头文件一起分发?或者是 mylibrary.h莫名其妙地从二进制库文件中导出?

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

最佳答案

是的,根据平台的不同,您可以获得更多文件来分发。这是一个相当困惑的故事。至少,库是静态的还是动态的(除了链接器参数)并不重要。

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

在某些平台上,二进制文件甚至不包含函数名称。相反,函数是通过它们在“序数表”中的位置来引用的。在这些平台上,库必须提供一个 header 、可执行二进制文件和一个附加文件,该文件将 header 中的函数名称转换为序数表中的函数索引,例如“void hello(void) ” 可能是链接器的“序数表中索引 3 处的函数”。

相反,包含 header (通常)不会链接到它随附的库。这在某些平台上是可能的,比如 Windows,在这些平台上,您可以将特殊的编译器指令放入 header 中,并告诉链接器链接到某个库,但这不是标准行为,您不能指望它是任何其他平台上的现实。

即将出现的是模块,它们提供了更好的用户体验来链接二进制文件。模块是另一个可以与二进制文件打包的文件,上面写着“这是我所有的头文件,这是我所有的库”。使用模块,可以编写诸如“import MyLibrary;”之类的东西。它会为您提供您需要的所有标题和所有链接器参数。我相信还没有 C 标准模块。 C++ 与 C++20 一起到达那里。

关于c - C 库是否与文本头文件以及二进制文件一起分发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55768197/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com