何时需要使用静态库的头文件?

When is a header file required for using a static library?

本文关键字:文件 静态 何时需      更新时间:2023-10-16

如果我在 Linux 的 C++ 中创建一个静态库,从而生成一个".a"文件,我(或其他任何人)如何使用该库? 例如,我的库定义了一个类。 我认为仅仅提供".a"文件是不够的,而且还提供一个头文件。 我如何知道哪些头文件必须随".a"文件一起提供?

例如,我是否需要为我的库提供代码中任何位置包含的所有头文件?

头文件为类和函数提供"声明"。 编译器需要这些,因此它可以 a) 验证您是否传递了正确的参数,和/或设置类/结构的正确数据成员,以及 b) 这样它就可以知道如何调用这些函数。

void do_something(int a, std::string& s);

告诉编译器此函数需要两个参数:intstring&。这将验证您是否传递了正确类型的参数(语言级构造),并解释了编译库中的目标代码所期望的内容(两个参数 - 如何通过调用约定来确定)。

如果该编译库使用另一个库中的代码,则不必提供这些标头,因为它们与您编写的代码无关。 这些库在"应用程序二进制接口"(ABI)级别工作,而不是在"应用程序编程接口"(API)级别工作。这意味着他们只是在传递指针等。不是 C 类型的参数。

头文件的技术原因是让编译器在编译用户代码时知道名称和大小,以便它可以安排用户对象的布局。

这就是为什么private公共类的成员(注意强调:public,这里,不是关键字)必须在标头中公开的原因。

您可以避免将公开部分中布局的类仅作为指针或引用公开,因为它们的实际实例不会保留在生成的用户对象本身中。在这种情况下,您可以只声明名称。

您有 - 在实质上 - 顶部向用户提供所有声明

  • 用户代码需要访问
  • 以某种方式影响用户对象的大小和组成(即使没有用户的直接知识)。

我怎么知道".a"文件必须提供哪些头文件?

通常是描述您希望用户有权访问的功能的所有头文件。这意味着答案

我是否需要提供代码中任何位置包含的所有头文件

通常是"不,你没有" - 可能有你没有公开的内部/私有标头。

如果你想使用一个类,我假设你已经知道这个类叫什么。在这种情况下,您可以简单地搜索定义类的标头,并将其包含在内。