5

有时在使用 GCC 时,我会遇到这样的神秘错误:

未定义对“类名的 vtable”的引用

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

4

1 回答 1

2

来自gcc 常见问题解答

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

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

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

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

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

于 2010-02-08T20:03:21.777 回答