我在编译iPhone项目时遇到以下错误。谁知道我怎么解决它? “ved for oned :: MultiFormatUPCEANReader”,引自: MultiFormatUPCEANReader.o中__ZTVN4oned23MultiFormatUPCEANReaderE $ non_lazy_ptr ld:找不到符号 collect2:ld返回1退出状态
答案 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和这个问题已经解决了。
希望这有帮助。