g++链接报错:undefined reference to typeinfo of xxx

g++链接报错:undefined reference to typeinfo of xxx

问题背景

在项目中遇到了这样一个问题:C++文件编译都OK,但链接的时候报错:undefined reference to typeinfo for xxx。

std::typeinfo 是C++中的RTTI(RunTime Type Identification)机制中记录类型信息用的,dynamic_casttypeid 操作符会使用这些信息。

虚函数未实现

最常见的原因就是基类的虚函数未实现了。由于C++类的实现可以分布在多个源文件中,所以生成目标文件时,基类的虚函数没有定义是不会报错的。但是链接成可执行文件时,需要将虚函数的信息放进typeinfo中,这个时候虚函数未实现就会引发这个错误。

混用了no-RTTI代码和RTTI代码

难搞的就是这种情况。

如果混用了使用 -fno-rtti-frtti 编译的代码后,当代码中写了创建含有虚函数的类的对象、使用 dynamic_cast 等时就会发生这个错误

项目中我们自己写的程序必须开启RTTI,而我们使用的外部的一个库使用no-RTTI编译。我们在自己的代码中需要重载一个外部库中的带虚函数的类,结果链接的时候就出现了问题。外部库中的基类使用 -fno-rtti 选项编译,生成的代码没有typeinfo信息,而我们的代码使用 -frtti 选项编译,要求基类必须要有typeinfo信息。最后,我让那个派生类所在的源文件以-fno-rtti选项编译,解决了问题。

posted @ 2024-08-30 17:56  3的4次方  阅读(1)  评论(0编辑  收藏  举报