我在编译iPhone项目时遇到以下错误:
"vtable for oned::MultiFormatUPCEANReader", referenced from:
__ZTVN4oned23MultiFormatUPCEANReaderE$non_lazy_ptr in MultiFormatUPCEANReader.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
有人知道我该如何修复它吗?
我在编译iPhone项目时遇到以下错误:
"vtable for oned::MultiFormatUPCEANReader", referenced from:
__ZTVN4oned23MultiFormatUPCEANReaderE$non_lazy_ptr in MultiFormatUPCEANReader.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
有人知道我该如何修复它吗?
问题似乎在于我在MultiFormatUPCEANReader类中声明了构造函数和析构函数,但没有为析构函数编写函数体,这导致了这个恼人的问题。希望这能帮助某些人解决他们的编译错误。 这是一个信息很少的糟糕的编译器错误!
通常情况下,这是缺失vtable问题:C++ FAQ Lite 23.10。
来自Internet Archive:
如果您收到以下形式的链接错误:“Error: Unresolved or undefined symbols detected: virtual table for class Fred”,则可能在类Fred中有未定义的虚拟成员函数。
编译器通常会为具有虚拟函数的类创建一个名为“virtual table”的神奇数据结构(这就是它处理动态绑定的方式)。通常情况下,您根本不需要了解它。但是,如果您忘记为类Fred定义虚拟函数,则有时会收到此链接器错误。
以下是详细信息:许多编译器将这个神奇的“virtual table”放在定义类中的第一个非内联虚拟函数的编译单元中。因此,如果Fred中的第一个非内联虚拟函数是wilma(),编译器将在看到Fred::wilma()的编译单元中放置Fred的虚拟表。不幸的是,如果您意外忘记定义Fred::wilma(),那么您可能会得到一个“Fred的虚拟表未定义”的错误消息,而不是“Fred::wilma()未定义”。真是太遗憾了。
在我的情况下,这是一个在基类中定义的纯虚方法,在派生类中被声明但未实现(更具体地说,是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;}
};
当一个人忘记在cpp文件中方法定义前面放置类名时,就会出现相同的错误 - 就像我刚才所做的那样。这不是xcode的问题,我正在使用cmake进行构建和gcc作为编译器(通常与xcode一起使用)。
{}
时,错误消失了。 - Paul