不同的C++类声明

sil*_*orb 5 c++ compilation class declaration static-linking

我正在尝试使用不使用命名空间的第三方C++库,并导致符号冲突.冲突的符号用于我的代码没有使用的类,所以我考虑为第三方库创建自定义头文件,其中类声明仅包括我的代码使用的公共成员,而忽略使用冲突类的任何成员.基本上创建一个界面.

我有三个问题:

  1. 如果.obj文件的编译工作,当我进行链接时,这种技术是否会导致符号冲突?

  2. 如果这不是问题,那么变化的类声明会在链接时引起问题吗?例如,链接器是否验证每个.obj文件使用的类的声明是否具有相同数量的成员?

  3. 如果这些都不是问题而且我能够链接.obj文件,它会在调用方法时引起问题吗?我不确切知道C++是如何工作的,但如果它使用索引指向类方法,并且那些索引从一个.obj文件到另一个不同,我猜这种方法会在运行时爆炸.

Kei*_*ith 1

理论上,您需要相同的声明才能使其发挥作用。

在实践中,您肯定需要确保您的声明包含:

  • 您使用的所有方法
  • 所有虚拟方法,无论使用与否。
  • 所有数据成员

您还需要按照正确的声明顺序执行所有这些操作。

您可能可以伪造数据成员,但需要确保放入具有相同大小的存根。

如果您不执行所有这些操作,您将不会获得相同的对象布局,即使链接有效,它也会在运行时严重且快速地失败。

如果你这样做,对我来说仍然有风险,最坏的情况可能看起来可行,但会出现奇怪的运行时故障。

“如果它使用索引”:在某种程度上,虚拟函数的工作方式是由实现定义的,但通常它确实使用虚拟函数表的索引。

您可能可以做的是:

  • 获取原始标题
  • 保留您使用的类的完整声明
  • 删除您不使用但被您使用的类和声明所引用的类和声明。
  • 删除所有根本没有引用的类型。