析构函数"Missing vtable",但定义了析构函数

"Missing vtable" for destructor, but destructor is defined

本文关键字:析构函数 定义 vtable Missing      更新时间:2023-10-16

我有一个类:

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类中的其他虚拟函数成为纯虚拟函数解决了问题。