DvQkdLdpcTxMessageProcessorReceiver类vtable未定义编译报错求助
报错根因说明
GCC中undefined reference to 'vtable for 类名'错误绝大多数场景是:类中声明了非内联、非纯虚的虚函数,但没有提供对应的实现,或是实现所在的源文件没有参与编译链接。
修复步骤
- 第一步:补全所有声明的函数实现
你在DvQkdLdpcTxMessageProcessorReceiver类中声明了以下三个非内联函数,必须在对应的.cpp文件中提供实现:
// 必须补全这三个函数的实现,哪怕是空实现也可以,不能只声明不实现 void DvQkdLdpcTxMessageProcessorReceiver::initialize(void) { // 功能逻辑 } bool DvQkdLdpcTxMessageProcessorReceiver::runBlock(void) { // 功能逻辑 } bool DvQkdLdpcTxMessageProcessorReceiver::outputReceivedData(std::vector <t_integer>& dataVector, Signal& outputSignal, bool &started) { // 功能逻辑 }
其中initialize和runBlock是继承自父类的虚函数,只要你在子类中重新声明了,就必须提供子类的专属实现。
第二步:确认实现文件加入编译列表
检查你的Makefile配置,确认存放上述实现的.cpp文件(通常命名为dv_qkd_ldpc_tx_message_processor_receiver.cpp)已经被加入到编译源文件列表中,没有被遗漏。第三步:可选优化,避免签名不匹配问题
可以在子类重写的虚函数声明后加上override关键字,C++编译器会在编译阶段就检查虚函数签名是否和父类匹配,避免因签名不一致导致的隐式未实现问题:
// 修改头文件中的对应声明 void initialize(void) override; bool runBlock(void) override;
- 第四步:清理缓存重新编译
旧的编译中间文件可能会导致链接异常,执行以下命令清理后重新编译即可:make clean && make
内容的提问来源于stack exchange,提问作者Zeinab Rahmani
相关产品推荐
相关产品推荐

