包含了类头文件,G++编译后nm查看.a文件提示U typeinfo Platform

tianjigezhuhn 2019-08-08 11:50:01
近期有项目需要移植到linux下,使用Qt作为开发环境。以前都是使用VS2010开发,并没有出现问题。在linux下却出现了未定义符号问题。

问题:
通过QLibrary加载项目中的动态链接库时,提示未定义符号Platform,经过排查是动态链接库链接的静态链接库Common.a存在此未定义符号,最后定位到Common库的一个源文件Entity.cpp中。使用
nm Entity.o | grep Platform | c++filt
显示 U typeinfo Platform。
该cpp中包含了Platform.h头文件,使用了如下语句:
Platform* pPlatform = dynamic_cast<Platform*>(GetParent())

屏蔽此句后不报错,那问题应该就是出现在这里。
GetParent()返回的是IModel。IModel是Platform的一个虚基类。Platform实现在另外的库中,这个类通过virtual继承了许多类,Platform的基类有抽象类、实类,其中有一些类存在继承关系也是使用virtual继承方式,Platform的继承关系像个网状。

临时处理方法是不使用dynamic_cast直接转换,而是再中间加一层:

void *ptr = dynamic_cast<void*>(GetParent());
Platform* pPlatform = (Platform*)ptr;

但是这样一来就必须明确知道GetParent返回的对象实际上就是Platform,并不安全。

我想知道为什么包含了头文件的情况下,在windows 7下使用vs2010正常,而在linux下Qt中使用dynamic_cast<Platform*>(GetParent())会出现未定义符号。两者的typeinfo和RTTI机制有什么不一样?
...全文
97 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianjigezhuhn 2019-08-08
  • 打赏
  • 举报
回复
补充:cpp文件,静态链接库,动态链接库在linux下都编译和链接成功,加载就出错了。

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧