【问题标题】:"undefined reference to `vtable.." - How to know which method isn't defined?“未定义对 `vtable 的引用..” - 如何知道未定义哪个方法?
【发布时间】:2016-11-24 09:34:04
【问题描述】:

链接时,例如在 linux 上使用 GCC 我得到:

undefined reference to `vtable for MyClass'

问题是,MyClass 祖先有大约 100 个纯虚方法,我不知道其中哪些没有定义。我真的必须通过所有这些来找出答案吗?

【问题讨论】:

  • @Jonas:这是否意味着“是”?
  • 是和不是。你可以试试(从上面的链接):nm -C NameOfObjectFile.o | grep MyClass::
  • @Jonas:恐怕这对我没有帮助。我需要知道哪些方法是定义的。
  • 我想你应该列出所有方法,然后减去前面命令返回的那些。

标签: c++ linker polymorphism virtual-functions pure-virtual


【解决方案1】:

正如@Jonas 评论链接中提到的,“未定义对 vtable 的引用”消息仅在未定义 first 声明的虚拟方法时才会出现:https://stackoverflow.com/a/28458010/1274747

正如我刚才尝试的那样,情况确实如此:如果未定义第一个声明的覆盖虚拟方法,则会收到 vtable 错误。如果未定义其他一些函数,我会得到该特定方法的未定义引用错误。

例子:

struct base
{
    virtual ~base() {}
    virtual int func1() = 0;
    virtual int func2() = 0;
};

struct derived: base
{
    virtual int func1();
    virtual int func2();
};

// switch the comment to define one or the other
int derived::func1() // undefined reference to `derived::func2()'
// int derived::func2() // "undefined reference to `vtable for derived'"
{
    return 5;
}

int main()
{
    derived d;
    return 0;
}

也就是说,检查派生类中声明的第一个虚函数(它也可能是一个虚析构函数)。

【讨论】:

  • 谢谢!如果编译器/链接器足够聪明地告诉我,那就太好了:)
猜你喜欢
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多