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

时间:2009-09-22 05:04:04

标签: c++ iphone xcode

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

5 个答案:

答案 0 :(得分:40)

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

答案 1 :(得分:12)

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

来自互联网档案馆:

  

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

     

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

     

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

答案 2 :(得分: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;}
};

答案 3 :(得分:4)

当忘记将类名放在cpp文件中的方法定义之前时,会发生同样的错误 - 就像我刚刚做的那样。它不是xcode的东西,我使用cmake构建和gcc作为编译器(正如xcode通常那样)。

答案 4 :(得分:3)

对我来说这是一个XCode的事情,因为我有相同的项目编译。

在我的文件Foo.h中,我有一个在.cpp文件中实现的构造函数和析构函数。但是我还有一个我在Foo.h中的类,它的实现在Foo.h而不是.cpp。 所以我不得不在XCode项目中添加Foo.h文件 - &gt;目标 - &gt; “TragetName” - &gt; BuildSources和这个问题已经解决了。

希望这有帮助。