调试GCC中的vtable链接器错误

Jas*_*ion 5 debugging linker gcc vtable

偶尔当使用GCC时,我会得到如下的神秘错误:

未定义引用'vtable for classname'

当它不是由缺少的库引起时,这个不那么描述性的错误消息总是让我逐行挖掘代码文件以找到虚函数的缺失实现.有没有办法让链接器告诉我它缺少哪个虚函数,可能是一个标志或什么?或者它可能告诉我但我不明白它在说什么?

coe*_*udo 2

来自海湾合作委员会常见问题解答

构建 C++ 时,链接器说我的构造函数、析构函数或虚拟表未定义,但我定义了它们

ISO C++ 标准指定必须定义类的所有非纯虚拟方法,但不要求对违反此规则 [class.virtual]/8 的行为进行任何诊断。基于此假设,GCC 将仅在定义其第一个此类非内联方法的翻译单元中发出隐式定义的构造函数、赋值运算符、析构函数和类的虚拟表。

因此,如果您未能定义此特定方法,链接器可能会抱怨缺少明显不相关符号的定义。 不幸的是,为了改善此错误消息,可能需要更改链接器,但这并不总是可以完成。

解决方案是确保定义所有非纯虚拟方法。请注意,即使声明为纯虚拟 [class.dtor]/7,也必须定义析构函数。

我采用的解决方案是搜索类名并查找虚拟方法声明并检查是否有定义。我没有找到任何其他解决方案。