dynamic_cast 在 linux 编译时 "long distance" 兄弟姐妹之间失败

dynamic_cast fails between "long distance" siblings on linux compilation

有一个 class DerivedClass 继承自 BaseClassABaseClassB 公开。所有 classes 都有虚拟函数以确保正确构建虚拟 table。

BaseClassABaseClassB位于在 Library1DerivedClassLibrary2.

Library1 中的一个函数以 [=46] 的形式检索 DerivedClass =]BaseClassA 指针并尝试从 dynamic_cast 到 BaseClassB 但是它失败。相同的函数适用于不同的环境和编译器(例如 visual studio)。

补充信息:

我想这可能是以下问题之一

  1. 重复符号
  2. 链接库中某处的隐藏符号
  3. 重复 vtables
  4. -E 和 RTLD_GLOBAL dlopen 标志 linker flag 无效(链接是使用 makefile 链接器阶段进行的,可能不是 dlopen。
  5. non-inline function manipulation(也没有用 - 但可能是我理解必须要做的事情的错误)

一直在努力寻找解决方案的网络。但我首先想知道的是问题是什么?我怎样才能专注于它?

(5) 看起来很有前途,尽管我没有设法使用它。

如有任何建议,我们将不胜感激(解决方案也很棒 ;))

显然#4 就是答案。 这是一个动态加载功能的隐藏功能,必须单独处理。将 -Wl,-E 标志添加到链接过程并更改加载程序标志就可以了。

我想知道是否有任何linuxy方式来理解这个错误。

我尝试过类似 "ldd" 命令或其他命令(top、nm、readelf 等)但看不到任何指向此确切错误的内容。

感谢SOF在各个学科的不断帮助