近期有项目需要移植到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机制有什么不一样?