如何解决“缺少vtable通常意味着第一个非内联虚成员函数没有定义。”

Posted

技术标签:

【中文标题】如何解决“缺少vtable通常意味着第一个非内联虚成员函数没有定义。”【英文标题】:How to solve " a missing vtable usually means the first non-inline virtual member function has no definition." 【发布时间】:2020-07-23 14:11:28 【问题描述】:

我试图查看虚拟函数是如何编译的,但似乎我无法将一个简单的示例编译为 macOS 上的 dylib。

我已经经历了无数次代码和 SO 答案的排列,但我无法将这个微不足道的示例编译(或者更确切地说是链接):

clang -dynamiclib -o test.dylib test.cc

代码如下:

class Animal 
    public:
        virtual void who();
;

class Cat : Animal

  public:
    virtual void who();
;

void Cat::who() 
    

这是完整的错误:

clang -dynamiclib -o test.dylib test.cc
Undefined symbols for architecture x86_64:
  "vtable for __cxxabiv1::__class_type_info", referenced from:
      typeinfo for Animal in test-be905f.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for __cxxabiv1::__vmi_class_type_info", referenced from:
      typeinfo for Cat in test-be905f.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

【问题讨论】:

使用 clang++,而不是 clang。 哇,哇。我工作。您能否详细说明一下并解释为什么另一个有效而另一个无效,因为它们都编译 C++ ?如果 这个 *** 问题可能会对您有所帮助:What is the difference? clang++ | clang -std=c++11 谢谢,这就解释了。但我必须同意其中一位评论者的观点:“但是,如果他们不将链接器也更改为正确的语言,为什么还要麻烦给你 -x 或 -std= 标志呢?”即如果它看起来理解代码是 c++ 并编译它,为什么它不一路走... @ecatmur 我明白了,谢谢。仍然我不禁觉得有人可以在错误消息或调用此功能以执行“准系统”C++ 的方式上做得更好。 【参考方案1】:

恐怕NOTE 是一个红鲱鱼。 vtable for __cxxabiv1::__class_type_info 是 C++ 标准库中的符号,而不是你的代码中的符号(std::type_info 是 polymorphic class),所以这个错误实际上意味着你需要链接 C++ 标准库。

最简单的方法是在您编写的命令行中将clang 更改为clang++。 difference between clang and clang++ 是前者默认编译链接为C,后者默认编译链接C++,但都可以编译两种语言。

【讨论】:

以上是关于如何解决“缺少vtable通常意味着第一个非内联虚成员函数没有定义。”的主要内容,如果未能解决你的问题,请参考以下文章

云原生景观:可观察性和分析解决了什么问题?如何解决的?

如何解决 Ajax 跨域请求不到的问题

如何解决包冲突问题

如何解决包冲突问题

如何解决ajax跨域问题

MySQL 的 10048问题,如何解决?