为了账号安全,请及时绑定邮箱和手机立即绑定

g ++ undefined对typeinfo的引用

g ++ undefined对typeinfo的引用

C++
元芳怎么了 2019-08-12 15:07:11
g ++ undefined对typeinfo的引用我只是遇到了以下错误(并在线找到了解决方案,但它在Stack Overflow中不存在):(.gnu.linkonce。[stuff]):对[方法] [目标文件]的未定义引用:(。gnu.linkonce。[stuff]):对[classname]的`typeinfo的未定义引用为什么可能会得到这些“未定义的typeinfo引用”链接器错误之一?(如果你能解释幕后发生的事情,可以给予奖励。)
查看完整描述

3 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

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

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

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

virtual void fn() { /* insert code here */ }

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

这条线

virtual void fn();

声明fn()而不定义它,并将导致您询问的错误消息。

它与代码非常相似:

extern int i;int *pi = &i;

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


查看完整回答
反对 回复 2019-08-12
?
FFIVE

TA贡献1797条经验 获得超6个赞

混合-fno-rtti-frtti编码时也会发生这种情况。然后,您需要确保type_info-frtti代码中访问的任何类都使用其密钥方法进行编译-frtti。当您创建类的对象,使用dynamic_cast等时,可能会发生此类访问。


查看完整回答
反对 回复 2019-08-12
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

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

virtual void foo();

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

virtual void foo() {}

或者声明纯虚拟:

virtual void foo() = 0;


查看完整回答
反对 回复 2019-08-12
  • 3 回答
  • 0 关注
  • 467 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信