有一个类 DerivedClass 继承自 BaseClassA 和 BaseClassB公开。所有类都有虚函数以确保正确构建虚表。
BaseClassA 和 BaseClassB 位于 Library1 和 < em>DerivedClass 在 Library2 中。
Library1 中的一个函数以 BaseClassA 的形式检索 DerivedClass> 指针并尝试 dynamic_cast 到 BaseClassB 但它失败了。相同的功能适用于不同的环境和编译器(例如 visual studio)。
额外信息:
- 使用 4.1.2 和 4.5 gcc 版本复制(阅读有关旧 gcc 错误的信息)
- 派生类名称是“Match”(认为它可能与其他库冲突?python?)
- 有数十个库一个接一个地编译,同时在它们之间进行链接。
- nm -gC:找到Match的虚表地址
- gdb (7.0.1):用于检查类的 vtable 地址,但不太了解。 (gdb 版本不支持“info vtbl”。gdb 无法显示关于声称它是 typedef 的类的直接信息)
- readelf -s:我看到了符号
我想这可能是以下问题之一
- 重复符号
- 链接库中某处的隐藏符号
- 重复的虚表
- -E 和 RTLD_GLOBAL dlopen 标志 linker flag无效(链接是使用 makefile 链接器阶段进行的,可能不是 dlopen。
- non-inline function manipulation (也没有用 - 但可能是我理解必须要做的事情的错误)
一直在努力寻找解决方案的网络。但我首先想知道的是问题是什么?我怎样才能专注于它?
(5) 看起来很有前途,尽管我没有设法使用它。
任何建议将不胜感激(解决方案也很好;))
最佳答案
显然#4 就是答案。 这是一个动态加载功能的隐藏功能,必须单独处理。将 -Wl,-E 标志添加到链接过程并更改加载程序标志就可以了。
我想知道是否有任何 linux 方式来理解这个错误。
我尝试过类似“ldd”命令或其他命令(top、nm、readelf 等)但看不到任何指向这个确切错误的东西。
感谢SOF在各个学科的持续帮助
关于c++ - dynamic_cast 在 linux 编译上的 "long distance"兄弟之间失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40469800/