当使用GCC时,我会得到这样的神秘错误:
未定义引用'vtable for classname'
当它不是由缺少的库引起时,这个不那么描述性的错误消息总是让我逐行挖掘代码文件以找到虚函数的缺失实现。有没有办法让链接器告诉我它缺少哪个虚拟函数,可能是一个标志或什么?或者它可能告诉我但我不明白它在说什么?
答案 0 :(得分:2)
来自gcc faq:
构建C ++时,链接器会说我的 构造函数,析构函数或虚函数 表是未定义的,但我定义了 它们强>
ISO C ++标准规定了这一点 类的所有虚方法 不是纯虚拟必须定义, 但不需要任何诊断 违反此规则的行为 [class.virtual] / 8。基于此 假设,GCC只会排放 隐式定义的构造函数, 赋值运算符,析构函数 和一个类的虚拟表 定义其的翻译单位 第一个这样的非内联方法。
因此,如果您未能定义此内容 特定方法,链接器可以 抱怨缺乏定义 对于显然不相关的符号。 不幸的是,为了改进 这个错误信息,它可能是 必须更改链接器,和 这并非总是如此。
解决方案是确保所有 不纯的虚拟方法 定义。请注意,析构函数必须 即使它被声明也要被定义 pure-virtual [class.dtor] / 7.
我采用的解决方案是搜索类名并查找虚方法声明并检查是否有任何定义。我没有找到任何其他解决方案。