Linux 编译"long distance"兄弟姐妹之间的dynamic_cast失败
dynamic_cast fails between "long distance" siblings on linux compilation
有一个类DerivedClass,它公开继承了BaseClassA和BaseClassB。所有类都有虚函数,以确保正确构建虚表。
BaseClassA 和 BaseClassB 位于 Library1 和 DerivedClass 在 Library2 。
Library1中的一个函数以BaseClassA指针的形式检索DerivedClass,并尝试动态转换到BaseClassB,但失败了。相同的函数可以在不同的环境和编译器中工作(例如visual studio)。
额外信息:- 使用4.1.2和4.5 gcc版本复制(阅读旧的gcc错误)
- 派生类名称是"匹配"(认为它可能与其他库碰撞?python ?)
- 有几十个库一个接一个地编译,并相互链接。
- nm -gC:找到匹配 的虚值表地址
- gdb(7.0.1):用于检查类的虚函数表地址,但不太理解。gdb版本不支持"info vtbl"。gdb不能显示关于类的直接信息,声称它是一个类型定义
- readelf -s:我看到符号
我猜可能是下列问题之一
- 重复符号
- 隐藏符号在库链接的某个地方
- 复制vtable
- -E和RTLD_GLOBAL dlopen标志链接标志不起作用(链接是使用makefile链接阶段进行的,可能不是dlopen。
- 非内联函数操作(没有工作,但可能是我的错误,理解到底要做什么)
一直在网上寻找解决方案。但我首先想知道的是问题出在哪里?我该如何专注于它?
(5)看起来很有希望,尽管我没有设法使用它。
任何建议都将非常感谢(解决方案也会很棒;))
显然答案是#4。这是一个隐藏的功能,动态加载函数,必须单独处理。在链接过程中添加-Wl,-E标志,并更改加载器标志,就可以达到目的。
我想知道的是,如果有任何linux的方式来理解这是错误的。
类似"ldd"或其他命令(top, nm, readelf等),我尝试过,但没有看到任何指向这个确切错误的东西。
感谢SOF在各个学科上的持续帮助
相关文章:
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 在成员dynamic_bitset上使用 boost::from_block_range 时出错,但在本地dynamic
- C++类中的二维"dynamic"数组?
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- protobuf in C++ with dynamic binding for google::protobuf::M
- 警告的原因是什么:"when type is in parentheses, array cannot have dynamic size"?
- C++:"Expected '(' for function-style cast or type construction"错误
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- CUDA 错误:"dynamic initialization is not supported for __device__, __constant__ and __shared__ variabl
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- 如何修复'The procedure entry point SDL_RWclose could not be located in the dynamic link library'
- Shared_ptr cast vs static_cast speed
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- "The ordinal 344 could not be located in the dynamic link library"
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- Dynamic Cast C++ Fail
- dynamic-cast-c++dynamic_cast错误处理