链接C ++中没有头文件的结构和函数

时间:2016-05-09 13:29:30

标签: c++ struct linker

我正在尝试使用其他程序用C ++编写的共享库。我已经完成了共享库,我测试了它的工作原理。

上面提到的共享库与其他库有依赖关系。我已经避免了这个问题,编译我的共享库告诉链接器在哪里找到这些依赖项,并将该共享库及其所有依赖项部署到一个文件夹中。

问题

现在我的问题是头文件。我有一个头文件要与我的共享库一起部署,但是这个头文件还包括第三方头文件。例如,我的共享库A及其头文件AHAH需要包含BHCH个头文件才能获得定义,这就是我想要避免的内容

然后,我认为解决方案可能是在我需要的第三方功能上使用extern关键字。这个问题是我还需要一些structs的定义(在上面提到的第三方头文件中声明)。那么,如何使用extern关键字包含此结构定义? 有没有更好的方法来做我想要的?

1 个答案:

答案 0 :(得分:2)

  

我有一个头文件要与我的共享库一起部署

为什么呢?只有在编译时才需要标头。如果你想要的只是运行使用它的程序,你不需要提供标题和库。

但也许您确实想要构建使用您的库的其他程序。

  

但此头文件还包含第三方标头。例如,我的共享库A及其头文件AHAH需要包含BHCH个头文件才能获得定义,这就是我想要避免的内容

你没有多大意义。如果AH需要BHCH提供的定义(或者您的意思是声明),那么您只有两个选项:

  1. 确保BHCH可用,或
  2. 提供AH所需的定义/声明的替代兼容版本。
  3. 您描述了需要函数声明。当然,如果您在AH中调用了B和C函数,那么您需要完整这些函数的声明。函数声明默认为extern,因此不必担心,但必须拥有完整的原型。如果您愿意,可以复制来自BHCH的内容,但这有点可疑。

    您还描述了需要struct声明。类型声明没有链接,因此extern与它们无关;只有当你在谈论全局变量时,extern才对此很重要。如果仅使用对这些结构的实例的不透明指针,则不需要structs的完整声明。这意味着永远不要直接实例化它们;从不取消引用它们,甚至不调用它们的方法;并且通常不会做任何取决于其大小或布局的事情。如果您的用法 - 包含在您自己的标题文件AH 中 - 符合这些要求,那么您可以提供自己的,不完整的结构来代替完整的结构声明:

    struct b_struct;
    

    当然,既然你不能直接用指针做任何事情,只有指向它们的指针是由库B和C的函数提供的,而你自己的代码除了它们之外什么都不做存储它们并将它们作为函数或方法参数传递。如果您需要更大的容量,那么您需要完整的声明。与功能一样,您可以复制这些功能。甚至比功能还要多,这是值得怀疑的。

    更一般地说,您可以查询

      

    如何使用extern关键字包含[...]定义?

    必须了解extern关联有关。它主要关注函数,方法和变量的运行时可见性。它仅与编译时可见性有关,因为编译器和链接器实现了链接规则。在extern类型的声明上使用struct关键字不会神奇地使该类型对不包含该类型的实际声明的代码可见。