何时需要使用静态库的头文件?
When is a header file required for using a static library?
如果我在 Linux 的 C++ 中创建一个静态库,从而生成一个".a"文件,我(或其他任何人)如何使用该库? 例如,我的库定义了一个类。 我认为仅仅提供".a"文件是不够的,而且还提供一个头文件。 我如何知道哪些头文件必须随".a"文件一起提供?
例如,我是否需要为我的库提供代码中任何位置包含的所有头文件?
头文件为类和函数提供"声明"。 编译器需要这些,因此它可以 a) 验证您是否传递了正确的参数,和/或设置类/结构的正确数据成员,以及 b) 这样它就可以知道如何调用这些函数。
void do_something(int a, std::string& s);
告诉编译器此函数需要两个参数:int
和string&
。这将验证您是否传递了正确类型的参数(语言级构造),并解释了编译库中的目标代码所期望的内容(两个参数 - 如何通过调用约定来确定)。
如果该编译库使用另一个库中的代码,则不必提供这些标头,因为它们与您编写的代码无关。 这些库在"应用程序二进制接口"(ABI)级别工作,而不是在"应用程序编程接口"(API)级别工作。这意味着他们只是在传递指针等。不是 C 类型的参数。
头文件的技术原因是让编译器在编译用户代码时知道名称和大小,以便它可以安排用户对象的布局。
这就是为什么private
公共类的成员(注意强调:public,这里,不是关键字)必须在标头中公开的原因。
您可以避免将公开部分中布局的类仅作为指针或引用公开,因为它们的实际实例不会保留在生成的用户对象本身中。在这种情况下,您可以只声明名称。
您有 - 在实质上 - 顶部向用户提供所有声明
- 用户代码需要访问
- 以某种方式影响用户对象的大小和组成(即使没有用户的直接知识)。
我怎么知道".a"文件必须提供哪些头文件?
通常是描述您希望用户有权访问的功能的所有头文件。这意味着答案
我是否需要提供代码中任何位置包含的所有头文件
通常是"不,你没有" - 可能有你没有公开的内部/私有标头。
如果你想使用一个类,我假设你已经知道这个类叫什么。在这种情况下,您可以简单地搜索定义类的标头,并将其包含在内。
- 使用gcc从静态链接的文件中查找可选符号
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- Android 在编译二进制文件时重建静态库
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 我可以读取静态对象中的文件.txt吗?C++
- 复制文件流C++静态变量
- 调用在 HXX 文件中声明的静态数据成员
- 链接时,不同静态库中的同一对象文件
- 如何在 linux 可执行文件中使用静态库
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- 在链接可执行文件之前查找静态库未解析的依赖项
- LNK2019 在文件中调用静态成员的方法时出错.cpp
- 访问从 CPP 文件到其他头文件的静态变量
- 无法将静态二进制文件链接到 #include
- 如何将 cpp 文件中的静态函数公开给其他文件
- 从 .so/.o 文件中获取 C/cpp 中的静态库列表
- 从内联函数引用文件静态变量
- IDL文件-静态链接或动态链接