c++ - dynamic_cast 在 linux 编译上的 "long distance"兄弟之间失败

标签 c++ linux gcc dynamic-cast

有一个类 DerivedClass 继承自 BaseClassABaseClassB公开。所有类都有虚函数以确保正确构建虚表。

BaseClassABaseClassB 位于 Library1< em>DerivedClassLibrary2 中。

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:我看到了符号

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

  1. 重复符号
  2. 链接库中某处的隐藏符号
  3. 重复的虚表
  4. -E 和 RTLD_GLOBAL dlopen 标志 linker flag无效(链接是使用 makefile 链接器阶段进行的,可能不是 dlopen。
  5. 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/

相关文章:

c++ - 如何在 OpenGL 中捕捉准确的帧率

c++ - GpuMat - 访问自定义内核中的 2 channel float 据

linux - 如何在远程克隆上 pull 更改

c - 使用 gcc 编译时总线错误

c - 类型转换 : double to char: multiple questions

c++ - 在写入之前检查 boost::interprocess::vector 是否有足够的容量?

linux - 的 | grep -c' 和完整路径

java - 使用脚本运行 java jar 文件

c++ - 用 gcc 打印 c,用 g++ 打印 c++

c++ - 从非托管 dll 中的 QThread 回调到托管 C++ 主线程