vtable for ..从编译错误xcode引用

And*_*res 17 c++ iphone xcode

编译iPhone项目时遇到以下错误.谁知道我怎么解决它?"ved for oned :: MultiFormatUPCEANReader",引用自:MultiFormatUPCEANReader.o中的__ZTVN4oned23MultiFormatUPCEANReaderE $ non_lazy_ptr ld:未找到符号collect2:ld返回1退出状态

And*_*res 40

问题似乎是在类MultiFormatUPCEANReader中我已经声明了构造函数和析构函数,但是没有为析构函数编写一个实体,这导致了这个恼人的问题.希望这有助于有人解决他们的编译错误.这是一个可怕的编译错误,信息很少!

  • 我同意,可怕的错误信息.我有这个因为没有在基类中实现虚方法. (4认同)

Dav*_*ner 13

通常,这是缺少的vtable问题:C++ FAQ Lite 23.10.

来自互联网档案:

如果您收到"错误:检测到未解析或未定义的符号:Fred类的虚拟表"形式的链接错误,您可能在类Fred中有一个未定义的虚拟成员函数.

编译器通常为具有虚函数的类创建一个称为"虚拟表"的神奇数据结构(这就是它处理动态绑定的方式).通常你根本不需要了解它.但是,如果您忘记为类F​​red定义虚函数,则有时会出现此链接器错误.

这里有一些细节:许多编译器将这个神奇的"虚拟表"放在编译单元中,该单元定义了类中的第一个非内联虚函数.因此,如果Fred中的第一个非内联虚函数是wilma(),编译器会将Fred的虚拟表放在它看到Fred :: wilma()的同一个编译单元中.不幸的是,如果您不小心忘记定义Fred :: wilma(),而不是未定义Fred :: wilma(),您可能会得到"Fred的虚拟表未定义".伤心但真实.


Rob*_*n R 6

在我的例子中,它是基类中定义的纯虚方法,它被声明但未在派生类中实现(更具体地说是vtable中的第一个虚方法),例如:

class Base
{
public:
  virtual int foo() = 0;
  virtual int bar() = 0;
};

class Derived : public Base
{
public:
  Derived() {}
  ~Derived() {}

  virtual int foo(); // <-- causes this obscure linker error
  virtual int bar() {return 0;}
};
Run Code Online (Sandbox Code Playgroud)