g++链接报错:undefined reference to typeinfo of xxx
问题背景
在项目中遇到了这样一个问题:C++文件编译都OK,但链接的时候报错:undefined reference to typeinfo for xxx。
std::typeinfo
是C++中的RTTI(RunTime Type Identification)机制中记录类型信息用的,dynamic_cast
和 typeid
操作符会使用这些信息。
虚函数未实现
最常见的原因就是基类的虚函数未实现了。由于C++类的实现可以分布在多个源文件中,所以生成目标文件时,基类的虚函数没有定义是不会报错的。但是链接成可执行文件时,需要将虚函数的信息放进typeinfo中,这个时候虚函数未实现就会引发这个错误。
混用了no-RTTI代码和RTTI代码
难搞的就是这种情况。
如果混用了使用 -fno-rtti
和 -frtti
编译的代码后,当代码中写了创建含有虚函数的类的对象、使用 dynamic_cast
等时就会发生这个错误。
项目中我们自己写的程序必须开启RTTI,而我们使用的外部的一个库使用no-RTTI编译。我们在自己的代码中需要重载一个外部库中的带虚函数的类,结果链接的时候就出现了问题。外部库中的基类使用 -fno-rtti
选项编译,生成的代码没有typeinfo信息,而我们的代码使用 -frtti
选项编译,要求基类必须要有typeinfo信息。最后,我让那个派生类所在的源文件以-fno-rtti选项编译,解决了问题。