如果我在 Linux 中用 C++ 创建一个静态库以生成“.a”文件,我(或其他任何人)如何使用该库?例如,我的库定义了一个类。我认为仅仅提供“.a”文件是不够的,还要提供一个头文件。我如何知道“.a”文件必须提供哪些头文件?
例如,我是否需要提供所有包含在我的库代码中的所有头文件?
如果我在 Linux 中用 C++ 创建一个静态库以生成“.a”文件,我(或其他任何人)如何使用该库?例如,我的库定义了一个类。我认为仅仅提供“.a”文件是不够的,还要提供一个头文件。我如何知道“.a”文件必须提供哪些头文件?
例如,我是否需要提供所有包含在我的库代码中的所有头文件?
头文件为类和函数提供“声明”。这些是编译器所需要的,因此它可以 a) 验证您是否传递了正确的参数,和/或设置了类/结构的正确数据成员,并且 b) 它可以知道如何调用这些函数。
void do_something(int a, std::string& s);
告诉编译器这个函数需要两个参数: anint
和 a string&
。这将验证您传递的参数类型是否正确(语言级构造),并解释了编译库中的目标代码所期望的内容(两个参数——如何由调用约定确定。)
如果该编译库使用来自另一个库的代码,则您不必提供这些标头,因为它们与您编写的代码无关。这些库工作在“应用程序二进制接口”(ABI)级别,而不是“应用程序编程接口”(API)。这意味着它们只是传递指针等。而不是 C 类型的参数。
我如何知道“.a”文件必须提供哪些头文件?
通常,所有描述您希望用户访问的功能的头文件。这意味着答案
我是否需要提供代码中任何位置包含的所有头文件
通常是“不,你没有” - 可能有你不公开的内部/私有标题。
头文件的技术原因是让编译器在编译用户代码时知道名称和大小,以便它可以安排用户对象的布局。
这就是为什么公共private
类的成员(注意重点:public,这里不是关键字)必须在标题中公开的原因。
您可以避免仅将在暴露部分中布局的类暴露为指针或引用,因为它们的实际实例不会留在生成的用户对象本身中。在这种情况下,您可以只声明名称。
您有 -in material-top 向用户提供所有声明
如果您想使用一个类,我假设您已经知道该类的名称。在这种情况下,您可以简单地搜索定义类的标头,并将其包含在内。