接口类编译时提示未定义错误:undefined reference to `typeinfo for

本文详细解析了C++中因虚函数未定义而引起的链接错误,通过具体实例展示了如何定位问题,并提供了有效的解决方案,强调了在基类中正确实现虚函数的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先贴出错误:

../libs/******/libsp***.so: undefined reference to `typeinfo for Base'
../libs******/libsp***.so: undefined reference to `Base::~Base()'
../libs******/libsp***.so: undefined reference to `vtable for Base'

可用如下实例进一步说明:

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() {} ;

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

根据你提供的编译错误信息,出现了多个链接错误未定义引用。 首先,错误信息指出在`ModbusConnection.cpp`文件中的`cp::ModbusConnection`构造函数和析构函数调用了基类`esf::Connection`的析构函数,但是找不到该析构函数的定义。 这个错误通常是由于链接阶段找不到基类成员函数的定义引起的。可能的原因有: 1. 基类`esf::Connection`的源文件或库文件没有正确地被编译和链接到最终的可执行文件中。请确保基类的实现文件或库文件被正确包含在编译和链接命令中。 2. 基类`esf::Connection`的析构函数没有被正确地定义和实现。请确保基类的析构函数在定义和实现时没有出错,并且在链接阶段能够找到。 3. 如果基类是一个纯虚基类(包含纯虚函数),则需要确保派生类实现了基类的纯虚函数。 另外,错误信息中还指出了对基类`esf::Connection`的虚函数表(vtable)和类型信息(typeinfo)的引用未定义。这可能是因为基类的析构函数没有被正确地定义和实现,导致编译器无法生成虚函数表和类型信息。 要解决这些问题,你可以检查以下几点: 1. 确保基类`esf::Connection`的头文件被正确地包含在相关源文件中。 2. 确保基类`esf::Connection`的实现文件被正确地编译和链接到最终的可执行文件中。 3. 检查基类`esf::Connection`的析构函数定义和实现是否正确,确保在链接阶段能够找到。 4. 如果基类是一个纯虚基类,确保派生类实现了基类的纯虚函数。 如果问题仍然存在,可能需要进一步检查编译和链接命令,以及相关的代码和上下文信息,以确定具体的解决方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值