具体问题:
在使用dynamic_pointer_cast由基类转换子类时,编译报错
报错:
/usr/bin/ld: CMakeFiles/sunnet.dir/src/Service.cpp.o: warning: relocation against `_ZTI7BaseMsg' in read-only section `.text._ZSt20dynamic_pointer_castI10ServiceMsg7BaseMsgESt10shared_ptrIT_ERKS2_IT0_E[_ZSt20dynamic_pointer_castI10ServiceMsg7BaseMsgESt10shared_ptrIT_ERKS2_IT0_E]'
/usr/bin/ld: CMakeFiles/sunnet.dir/src/Service.cpp.o: in function `std::shared_ptr<ServiceMsg> std::dynamic_pointer_cast<ServiceMsg, BaseMsg>(std::shared_ptr<BaseMsg> const&)':
Service.cpp:(.text._ZSt20dynamic_pointer_castI10ServiceMsg7BaseMsgESt10shared_ptrIT_ERKS2_IT0_E[_ZSt20dynamic_pointer_castI10ServiceMsg7BaseMsgESt10shared_ptrIT_ERKS2_IT0_E]+0x34): undefined reference to `typeinfo for BaseMsg'
/usr/bin/ld: CMakeFiles/sunnet.dir/src/Service.cpp.o: in function `ServiceMsg::ServiceMsg()':
Service.cpp:(.text._ZN10ServiceMsgC2Ev[_ZN10ServiceMsgC5Ev]+0x18): undefined reference to `BaseMsg::BaseMsg()'
/usr/bin/ld: CMakeFiles/sunnet.dir/src/Service.cpp.o: in function `ServiceMsg::~ServiceMsg()':
Service.cpp:(.text._ZN10ServiceMsgD2Ev[_ZN10ServiceMsgD5Ev]+0x38): undefined reference to `BaseMsg::~BaseMsg()'
/usr/bin/ld: CMakeFiles/sunnet.dir/src/Service.cpp.o:(.data.rel.ro._ZTI10ServiceMsg[_ZTI10ServiceMsg]+0x10): undefined reference to `typeinfo for BaseMsg'
/usr/bin/ld: warning: creating DT_TEXTREL in a PIE
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/sunnet.dir/build.make:145: sunnet] Error 1
make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/sunnet.dir/all] Error 2
make: *** [Makefile:91: all] Error 2
相关代码:
//消息基类
class BaseMsg
{
public:
enum Type {
//消息类型
SERVICE = 1
};
//消息类型
uint8_t type;
//用于检测内存泄漏,仅用于调试
char load[999999]{};
public:
BaseMsg();
virtual ~BaseMsg();
};
//服务间消息
class ServiceMsg:public BaseMsg{
public:
uint32_t source; //消息发送方
shared_ptr<char> buff; //消息内容
size_t size; //消息内容大小
};
类型转化:
auto m = dynamic_pointer_cast<ServiceMsg>(msg); //dynamic_pointer_cast 强制类型转换
解决方法:
在基类的构造函数和析构函数后加上 {}
BaseMsg(){};
virtual ~BaseMsg(){};
编译通过