析构函数"Missing vtable",但定义了析构函数
"Missing vtable" for destructor, but destructor is defined
我有一个类:
class Optimizer {
public:
Optimizer(mongoc_client_t *dbClient, std::string strategyName, std::string symbol, int group);
virtual ~Optimizer() = 0;
及其实现:
#include "optimizers/optimizer.h"
Optimizer::Optimizer(mongoc_client_t *dbClient, std::string strategyName, std::string symbol, int group) {
// ...
}
Optimizer::~Optimizer() {
free(data);
}
但我得到了以下错误,似乎与未定义的析构函数有关:
Undefined symbols for architecture x86_64:
"typeinfo for Optimizer", referenced from:
typeinfo for ReversalsOptimizer in reversalsOptimizer.o
"vtable for Optimizer", referenced from:
Optimizer::Optimizer(_mongoc_client_t*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int) in optimizer.o
Optimizer::~Optimizer() in optimizer.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)
make: *** [prepareData] Error 1
我做错了什么?完整的头定义在这里,实现在这里。
我也尝试过使析构函数成为非虚拟的,但它没有帮助。
问题正是错误消息所说的:
注:缺少vtable通常意味着第一个非内联虚拟成员函数没有定义。
具体来说,您声明并调用了这个函数,但从未定义过:
virtual void prepareStudies();
事实证明,使Optimizer类中的其他虚拟函数成为纯虚拟函数解决了问题。
相关文章:
- 添加自定义析构函数时,Move 构造函数在派生类中消失
- 如何正确定义C++类析构函数并将其链接到主文件?
- 仅在 MacOS 上析构函数的未定义符号
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- 对已定义的接口析构函数的未定义引用
- 对 clang 中析构函数的未定义引用
- 在从仅移动类型派生的类中定义析构函数在使用 std::vector emplace_back或push_back创建时会
- 为什么这个自定义分配器的析构函数在 GCC/MSVS 的 stdlib 中被调用两次
- 使用自定义工具集获取动态退出析构函数链接错误 - eh 矢量析构函数
- 为什么在定义析构函数时隐式删除移动构造函数
- DIRECTX9 中自定义顶点的虚拟析构函数
- 编译器定义的移动构造函数与析构函数
- 我可以解决unique_ptr在<MyType>仅存储 nullptr 时不需要 MyType 析构函数定义吗?
- 为什么复制构造函数不是微不足道的,因为有一个用户定义的析构函数?
- 仅在删除包含对象的向量时调用自定义»析构函数«
- 这个递归类需要一个自定义析构函数?
- 如果基类析构函数是虚拟的,是否需要派生类析构函数定义
- 添加析构函数定义将创建运行异常
- 类内部的纯虚析构函数定义会导致编译错误
- c++虚析构函数定义