如何解决“缺少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通常意味着第一个非内联虚成员函数没有定义。”的主要内容,如果未能解决你的问题,请参考以下文章