我可以告诉`vtable的未定义引用在哪里?

时间:2016-04-16 02:52:34

标签: c++ qt mingw undefined-reference virtual-method

我有一个C ++类,我试图模仿C#的界面,像这样:

class Foo {
public:
  virtual void baa();
}

这是来自一个在发布上编译好的大型Qt C ++项目,但是当我在 debug 模式下编译时出现了这个错误:

  

对vtable的未定义引用

我知道那个错误意味着什么:没有定义虚方法,对吧?我的问题是:

只有在调试时才会发生,我不知道为什么。我可以找到我没有定义该方法的源(即类)吗?

我愿意使用Qt本身,编译器选项,外部工具或其他任何东西。

1 个答案:

答案 0 :(得分:1)

  

“我能否找到我尚未定义该方法的来源(即班级)”

对我来说,第一个嫌疑人本身就是class Foo。检查其中是否包含void baa()的定义。如果未定义Foo::baa(),则您无法执行以下操作:

Foo foo;
foo.baa();  // undefined reference for `Foo::baa()`

现在如果你确实已经定义了Foo::baa(),那么可能这个错误将出现在Foo的其他一些子类中(但是我注意到g ++提到了哪个子类,奇怪为什么它对你来说不可见) ;

class Foo1 : public Foo

一种简单的方法是暂时将Foo::baa设为virtual

class Foo {
public: virtual void baa () = 0;
};

在这种情况下,无论哪个子类未覆盖此方法,都会生成编译器错误。由于行号等原因,这将使您的发现更容易。

为什么它在DEBUG模式下提供链接器错误是非常主观的,需要更多信息。