5

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

例如,我是否需要提供所有包含在我的库代码中的所有头文件?

4

4 回答 4

5

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

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

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

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

于 2012-12-16T07:50:49.963 回答
2

我如何知道“.a”文件必须提供哪些头文件?

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

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

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

于 2012-12-16T07:43:23.923 回答
2

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

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

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

您有 -in material-top 向用户提供所有声明

  • 用户代码需要访问
  • 以某种方式影响用户对象的大小和组成(即使没有用户的直接知识)。
于 2012-12-16T07:58:16.083 回答
1

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

于 2012-12-16T07:43:12.830 回答