C++ 适于。。从编译错误xcode引用
我在编译iPhone项目时遇到以下错误:C++ 适于。。从编译错误xcode引用,c++,iphone,xcode,C++,Iphone,Xcode,我在编译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 有人知道我如何修复它吗?问题似乎是,在Mu
"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问题: 从互联网档案: 如果您得到“error:Unresolved或undefined symbols detected:virtualtable for class Fred”形式的链接错误,则类Fred中可能有一个未定义的虚拟成员函数 编译器通常会为具有虚拟函数的类创建一个神奇的数据结构,称为“虚拟表”(这就是它处理动态绑定的方式)。通常你根本不需要知道。但是如果您忘记为类Fred定义一个虚拟函数,您有时会得到这个链接器错误 本质是这样的:许多编译器将这个神奇的“虚拟表”放在编译单元中,它定义了类中的第一个非内联虚拟函数。因此,如果Fred中的第一个非内联虚拟函数是wilma(),编译器将把Fred的虚拟表放在它看到Fred::wilma()的同一个编译单元中。不幸的是,如果您不小心忘记定义Fred::wilma(),而不是得到一个未定义的Fred::wilma(),您可能会得到一个“Fred的虚拟表未定义”。悲伤但真实
当一个人忘记将类名放在cpp文件中方法定义的前面时,同样的错误也会发生——就像我刚才所做的那样。它不是xcode的东西,我使用cmake进行构建,使用gcc作为编译器(xcode通常就是这样) 对我来说,这是一个XCode的东西,因为我有同样的项目 在我的文件Foo.h中,我在.cpp文件中实现了构造函数和析构函数。但是我还有另外一个类,我在Foo.h中有这个类,它的实现在Foo.h中,而不是在.cpp中。 因此,我不得不在XCode项目->目标->TragetName->构建源代码中添加Foo.h文件,这个问题就解决了
希望这有帮助。在我的例子中,它是基类中定义的纯虚拟方法,在派生类中声明但未实现(更具体地说是vtable中的第一个虚拟方法),例如:
类基
{
公众:
虚拟int foo()=0;
虚拟整型条()=0;
};
派生类:公共基
{
公众:
派生(){}
~Derived(){}
virtual int foo();//我同意,这是一条可怕的错误消息。我之所以这样做是因为在基类中没有实现virtual方法。感谢您回答这个问题——这是“vtable for referenced from”的第一个google结果--节省了我很多时间。老兄,你是个救命恩人!尽管为析构函数编写了一个正文,我还是收到了vtable错误。还有什么我可能遗漏的吗?@Nick--我也收到了这个错误,因为基类中的虚方法没有实现。当我添加一个简单的{
在声明之后。现在它被称为“编译源代码”,但对我来说非常有效!
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;}
};