首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >g++对typeinfo的引用未定义

g++对typeinfo的引用未定义
EN

Stack Overflow用户
提问于 2008-11-21 00:02:19
回答 18查看 215.1K关注 0票数 253

我刚刚遇到了以下错误(我在网上找到了解决方案,但它不存在于Stack Overflow中):

(.gnu.linkonce.stuff):未定义对方法的引用:(.gnu.linkonce.stuff):未定义对` `typeinfo for classname‘的引用

为什么会出现这样的“对typeinfo的引用未定义”的链接器错误?

(如果你能解释幕后发生的事情,你会得到加分。)

EN

回答 18

Stack Overflow用户

回答已采纳

发布于 2008-11-21 00:42:20

一个可能的原因是您在没有定义的情况下声明了一个虚函数。

如果您在没有在同一编译单元中定义它的情况下声明它,则表示它是在其他地方定义的-这意味着链接器阶段将尝试在其他编译单元(或库)中查找它。

定义虚拟函数的一个示例是:

代码语言:javascript
复制
virtual void fn() { /* insert code here */ }

在本例中,您将一个定义附加到声明,这意味着链接器不需要在以后解析它。

这条线

代码语言:javascript
复制
virtual void fn();

在未定义的情况下声明fn(),并将导致您询问的错误消息。

它与代码非常相似:

代码语言:javascript
复制
extern int i;
int *pi = &i;

这说明整数i是在另一个编译单元中声明的,该单元必须在链接时解析(否则pi不能设置为它的地址)。

票数 258
EN

Stack Overflow用户

发布于 2010-11-15 21:37:04

当您混合使用-fno-rtti-frtti代码时,也会发生这种情况。然后,您需要确保任何在-frtti代码中访问的type_info类都使用-frtti编译了它们的关键方法。当你创建一个类的对象,使用dynamic_cast等,就会发生这样的访问。

[source]

票数 164
EN

Stack Overflow用户

发布于 2008-11-21 00:17:05

当声明的(非纯)虚函数缺少主体时,就会发生这种情况。在您的类定义中,类似于:

代码语言:javascript
复制
virtual void foo();

应定义(内联或在链接的源文件中):

代码语言:javascript
复制
virtual void foo() {}

或者声明为纯虚拟的:

代码语言:javascript
复制
virtual void foo() = 0;
票数 68
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/307352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档