`
doujiu
  • 浏览: 90241 次
  • 性别: 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的情况,最后发现了问题所在,以此作为经验吧。

    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不仅仅是一个高性能的多维数据分析表,更是一个在行和列之间创造艺术的网格艺术家

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

    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`选项,...

    构造函数不能声明为虚函数的原因及分析

    1. 从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有...

    CPP-virtual-function-table.rar_Table

    在C++编程语言中,虚函数表(Virtual Function Table,简称vtable)是一个重要的概念,它主要用于实现多态性,这是面向对象编程的关键特性之一。本文将深入探讨虚函数表的工作原理、结构以及如何在实际编程中应用。 ...

    4.单继承下含覆盖函数的类对象的布局1

    它也使用VTable来存储虚函数指针,处理单继承时,子类对象的内存布局会包含父类的VTable,并且根据需要修改或扩展VTable。与Windows和Linux一样,Clang也支持RTTI,用于识别对象的动态类型。 在所有这些平台上,`...

Global site tag (gtag.js) - Google Analytics