Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 适于。。从编译错误xcode引用_C++_Iphone_Xcode - Fatal编程技术网

C++ 适于。。从编译错误xcode引用

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

我在编译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问题:

从互联网档案:

如果您得到“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;}
};