2010-02-02 50 views
5

现在再使用GCC时,我得到神秘的错误是这样的:调试虚函数表链接器错误

未定义参考“虚函数表的类名”

当它不被丢失的库造成的,这种不可─非常具有描述性的错误信息总是让我通过逐行挖掘代码文件来找到虚拟功能的缺失实现。有没有办法让链接器告诉我哪个虚函数丢失了,也许是一个标志或什么的?或者它可能告诉我,但我不明白它说的是什么?

回答

2

gcc faq

当编译C++,链接器说我 构造函数,析构函数或虚拟 表是不确定的,但我定义 他们

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

因此,如果您未能定义此特定方法,则链接程序可能会抱怨缺少对明显不相关的符号的定义 。 不幸的是,为了改进 这个错误信息,它可能是 需要更改链接器,而 这不能总是完成。

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

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