`
doujiu
  • 浏览: 91337 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

[转]undefined reference to vtable 原因与解决办法

阅读更多
C++:undefined reference to vtable 原因与解决办法[转]_留风的贝壳
[转]undefined reference to vtable 原因与解决办法

最近在写一套基础类库用于SG解包blob字段统计,在写完了所有程序编译时遇到一个郁闷无比的错误:
MailBox.o(.text+0x124): In function `CMailBox::CMailBox[not-in-charge](CMmogAnalyseStatManager*)':
../src/MailBox.cpp:27: undefined reference to `CSgAnalyseStatBase::~CSgAnalyseStatBase [not-in-charge]()'
MailBox.o(.text+0x182): In function `CMailBox::CMailBox[in-charge](CMmogAnalyseStatManager*)':
../src/MailBox.cpp:27: undefined reference to `CSgAnalyseStatBase::~CSgAnalyseStatBase [not-in-charge]()'
MailBox.o(.gnu.linkonce.t._ZN8CMailBoxD1Ev+0x33): In function `CMailBox::~CMailBox [in-charge]()':
../include/MailBox.hpp:22: undefined reference to `CSgAnalyseStatBase::~CSgAnalyseStatBase [not-in-charge]()'
MailBox.o(.gnu.linkonce.t._ZN8CMailBoxD1Ev+0x4f):../include/MailBox.hpp:22: undefined reference to `CSgAnalyseStatBase::~CSgAnalyseStatBase [not-in-charge]()'
MailBox.o(.gnu.linkonce.t._ZN8CMailBoxD0Ev+0x33): In function `CMailBox::~CMailBox [in-charge deleting]()':
../include/MailBox.hpp:22: undefined reference to `CSgAnalyseStatBase::~CSgAnalyseStatBase [not-in-charge]()'
MailBox.o(.gnu.linkonce.t._ZN8CMailBoxD0Ev+0x4f):../include/MailBox.hpp:22: more undefined references to `CSgAnalyseStatBase::~CSgAnalyseStatBase [not-in-charge]()' follow
MailBox.o(.gnu.linkonce.r._ZTI8CMailBox+0x8): undefined reference to `typeinfo for CSgAnalyseStatBase'
SgAnalyseStatBase.o(.text+0x1d): In function `CSgAnalyseStatBase::CSgAnalyseStatBase[not-in-charge](CMmogAnalyseStatManager*)':
../../sg_analyse_base/src/SgAnalyseStatBase.cpp:22: undefined reference to `vtable for CSgAnalyseStatBase'
SgAnalyseStatBase.o(.text+0x117): In function `CSgAnalyseStatBase::CSgAnalyseStatBase[in-charge](CMmogAnalyseStatManager*)':
../../sg_analyse_base/src/SgAnalyseStatBase.cpp:22: undefined reference to `vtable for CSgAnalyseStatBase'
collect2: ld returned 1 exit status
make: *** [MailBox] Error 1
这个问题困扰了我好几天,上班时间比较多人打扰,周末到了,决心一定要在这个周末将问题解决。搜索“vtable for”时总是搜到Qt出现的undefined reference to `vtable for`,找不到问题所在,一筹莫展。将编译环境从slack ware换到SLES,还是出现同样的错误。仔细看看,所有obj文件都已正常生成,是在链接成bin文件的时候出错的。再从错误信息中找没有搜索过的关键词来搜索,尝试了许多关键词后终于在搜索“undefined reference to `typeinfo”时在http://www.wellho.net/上看到:
undefined reference to typeinfo - C++ error message

There are some compiler and loader error messages that shout obviously as to their cause, but there are others that simply don't give the new user much of an indication as to what's really wrong. And most of those I get to know pretty quickly, so that I can whip around a room during a course, making suggestions to delegate to check for missing ; characters or double quotes, to check that they have used the right type of brackets for a list subscript and haven't unintentionally written a function call, etc.

Here's one of the more obscure messages from the Gnu C++ compiler - or rather from the loader:

g++ -o polygon shape.o circle.o square.o polygon.o
circle.o(.gnu.linkonce.r._ZTI6Circle+0x8): undefined reference to `typeinfo for Shape'
square.o(.gnu.linkonce.r._ZTI6Square+0x8): undefined reference to `typeinfo for Shape'
polygon.o(.gnu.linkonce.t._ZN5ShapeC2Ev+0x8): In function `Shape::Shape()':
: undefined reference to `vtable for Shape'
collect2: ld returned 1 exit status


And you can be scratching you head for hour over that one!

The error? shape.o contains a base class from which classes are derived in circle.o and square.o .. but virtual function(s) in shape's definition are missing null bodies.

The fix? You've got line(s) like
virtual float getarea() ;
that should read
virtual float getarea() {} ;

The complete (working) source code files for this example are available here

按照文中所说稍微修改了一下,在析构函数后面添加了{},再make,成功了,高兴啊!问题终于解决了。我的所有虚函数都是有定义的,没想到就因为写基类的这个虚析构函数大意,没写函数体就出现了一个困扰我几天的莫名其妙的错误。就virtual ~CSgAnalyseStatBase();和virtual ~CSgAnalyseStatBase() {};的区别,编译可以通过却搞出个莫名其妙的链接错误。链接器linker需要将虚函数表vtable 放入某个object file,但是linker无法找到正确的object文件。这个错误常见于刚刚创建一系列有继承关系的class的时候,这个时候很容易忘了给base class的virtual function加上函数实现。解决办法:给基类的virtual函数加上本来就应该有的function body。当含有虚函数的类未将析构函数声明为virtual时也会出现这个链接错误。不管如何,问题解决了,再辛苦也是值得的,以后在写代码时一定要严谨。


分享到:
评论

相关推荐

    vtable 虚函数表

    vtable 虚函数表 更加有效的理解虚函数

    VTable 是 VisActor 可视化体系中的表格组件库,基于可视化渲染引擎 VRender 进行封装

    VTable,不只是一款高性能的多维数据分析表格,更是一个在行列间创作的方格艺术家。VTable 是 VisActor 可视化体系中的表格组件库,基于可视化渲染引擎 VRender 进行封装。 核心能力如下:性能极致:支持百万级数据...

    vtable_hook:挂钩 vtables

    在C++编程中,"vtable_hook"是一个高级主题,主要涉及到对象的多态性和运行时类型信息(RTTI)。vtable(虚拟函数表)是C++实现多态性的一个关键机制,它允许通过基类指针调用派生类重写的虚函数。下面将深入探讨...

    Partial-Java-to-C-Translator:vtable,函数指针,类型转换,继承

    《从Java到C的部分翻译器:深入理解vtable、函数指针、类型转换与继承》 在编程领域,Java和C是两种截然不同的语言,它们各有特点,但也有各自的局限性。本项目"Partial-Java-to-C-Translator"旨在为开发者提供一个...

    vtable.rar

    标题中的“vtable.rar”可能是指一个包含有关虚函数表(Virtual Table,简称vtable)的示例代码,vtable是C++中实现多态性的一个关键机制。在C++中,当一个类声明了一个虚函数,编译器就会为这个类创建一个vtable,...

    QT在CodeBlocks中的配置

    重要补充 2:使用简单方法编译运行 QT 程序,可能会出现如下错误:undefined reference to vtable for LCDRange 出现这个错误是由于在类中使用了 Q_OBJECT 宏。这种情况下就不能用一键式的简单方法来 build 了。老老...

    QT继承QPushButton的动态按钮及信号槽设定

    本来是想学着做动态按键的,方法很多,可以很简单的。...遇到了纠结的问题,为了实现信号槽,需要加上Q_Object宏,此后又出现了undefined reference vtable for xxx的情况,最后发现了问题所在,以此作为经验吧。

    TypeScript_VTable不仅是一个高性能的多维数据分析表,也是一个网格艺术家,可以在行和列之间创建艺术.zip

    TypeScript_VTable不仅仅是一个用于数据分析的工具,更是一个将数据分析与艺术设计相结合的平台,它允许用户在分析数据的同时享受到视觉美学带来的愉悦感,这在技术与设计的融合趋势中显得尤为突出。

    CPP-function.rar_CPPFunction_doc_vtable

    本文将深入探讨C++中的虚函数表(Virtual Table,简称VTable)及其相关概念。 首先,虚函数是基类声明的一个成员函数,其目的是为了在运行时确定应该调用哪个类的实现。当基类指针或引用指向派生类对象时,如果调用...

    QT在CodeBlocks中的配置[参照].pdf

    在使用简化配置方法构建QT程序时,可能会遇到以下错误:“undefined reference to vtable for LCDRange”。出现这一错误的原因是在类中使用了`Q_OBJECT`宏。此时,建议按照第一种方法进行构建,即分三步完成构建过程...

    parrt-vtable:vtable 项目的入门套件

    vtable 项目的入门套件 见。

    vtable-dumper-1.2-10.el8.x64-86.rpm.tar.gz

    Centos8操作系统vtable-dumper-1.2-10.el8.rpm以及相关依赖,全打包为一个tar.gz压缩包 2、安装指令: #Step1、解压 tar -zxvf vtable-dumper-1.2-10.el8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh ...

    VTable不仅仅是一个高性能的多维数据分析表,更是一个在行和列之间创造艺术的网格艺术家

    VTable 是 VisActor 可视化体系中的表格组件库,基于可视化渲染引擎 VRender 进行封装。 核心能力如下:性能极致:支持百万级数据快速运算与渲染。多维分析:多维数据自动分析与呈现。表现力强:提供灵活强大的图形...

    System.TypeLoadException(解决方案).md

    因此,找出并解决TypeLoadException的出现原因,对于提高程序质量和用户体验是至关重要的。 针对System.TypeLoadException,主要有以下几种解决方案: 方案一:检查引用的DLL版本。开发者需要确保项目中引用的所有...

    art-hook-vtable-gsoc15:ARTDroid

    【标题】"ARTDroid: ART 模拟器动态钩子与GSOC15项目" 在Android操作系统中,Dalvik虚拟机(Dalvik)曾是应用程序运行的主要平台,但自Android 5.0 Lollipop开始,它被Android RunTime (ART)所取代。ARTDroid项目,...

    From C++ to Objective-C (从C++到ObjectivC)

    标题为“From C++ to Objective-C (从C++到Objective-C)”的文章主要探讨了从C++转向Objective-C的程序员应该了解的关键概念和差异。Objective-C是一种主要用在苹果公司产品开发上的面向对象的编程语言,特别是在Mac...

    (转)C++中解析动态联编

    这种技术与静态联编形成对比,后者在编译时就已经确定了函数调用。在C++中,多态性使得程序员可以设计通用的代码,这些代码能够处理不同类型的对象,而无需知道这些对象的具体实现细节。 静态联编是C语言的主要特点...

    RTTI内存模型布局研究

    在MSVC中,RTTI信息通常与Vtable紧密关联,包括类型信息结构(`__class_type_info`)、虚基类信息(`__virtual_inheritance_info`)等。这些结构提供了关于类层次结构的详细信息,例如基类的偏移量和访问权限。 在...

    面向对象程序设计 动态联编 C++

    纯虚函数的引入主要是为了解决基类不能实例化以及强制派生类实现特定功能的问题。当在基类中定义纯虚函数(`virtual returntype function()=0;`),这个基类就成为抽象类,不能被实例化。派生类必须重载纯虚函数以...

    调试记录1

    将BCC模式的结果转换为WRF的intermediate file格式时,必须确保写入的变量名与Vtable文件中的定义一致,否则WRF的metgrid模块将无法识别并报错。此外,由于字节序问题,编译时需要添加`-convert big_endian`选项,...

Global site tag (gtag.js) - Google Analytics