2009-09-22 10 views
17

Recibí el siguiente error al compilar un proyecto de iPhone. ¿Alguien sabe cómo puedo solucionarlo? "vtable para oned :: MultiFormatUPCEANReader", hace referencia a partir de: $ __ZTVN4oned23MultiFormatUPCEANReaderE non_lazy_ptr en MultiFormatUPCEANReader.o ld: Símbolo (s) que no se encuentra collect2: ld devolvió 1 Estado de salidavtable for ... al que se hace referencia desde el error de compilación xcode

Respuesta

38

El problema parecía ser que en el class MultiFormatUPCEANReader Había declarado un constructor y un destructor, pero no había escrito un cuerpo para el destructor, esto causaba este molesto problema. Espero que esto ayude a alguien a resolver su error de compilación. ¡Este es un terrible error de compilación con poca información!

+4

I de acuerdo, terrible mensaje de error. Tenía esto porque no hay implementación de método virtual en la clase base. – Nick

+1

Gracias por responder esta pregunta: viene como el primer resultado de google para "vtable para hacer referencia a", me ha ahorrado mucho tiempo. – noamtm

+0

¡Amigo eres un salvavidas! – cyclotrojan

12

Genéricamente, este es el problema de vtable faltante: C++ FAQ Lite 23.10.

Desde el Archivo de Internet: puede ocurrir

If you get a link error of the form "Error: Unresolved or undefined symbols detected: virtual table for class Fred," you probably have an undefined virtual member function in class Fred.

The compiler typically creates a magical data structure called the "virtual table" for classes that have virtual functions (this is how it handles dynamic binding). Normally you don't have to know about it at all. But if you forget to define a virtual function for class Fred, you will sometimes get this linker error.

Here's the nitty gritty: Many compilers put this magical "virtual table" in the compilation unit that defines the first non-inline virtual function in the class. Thus if the first non-inline virtual function in Fred is wilma(), the compiler will put Fred's virtual table in the same compilation unit where it sees Fred::wilma(). Unfortunately if you accidentally forget to define Fred::wilma(), rather than getting a Fred::wilma() is undefined, you may get a "Fred's virtual table is undefined". Sad but true.

+0

que salvó mi vida :) – name

+0

El enlace está muerto – Martin

4

El mismo error cuando uno se olvida de poner el nombre de clase frente a la definición de un método en el archivo CPP - como el que acabo de hacer. Y no es una cosa xcode, estoy usando cmake para compilar y gcc como compilador (como suele ser el caso de xcode).

+0

Tienes toda la razón – WINSergey

3

Para mí fue una cosa de XCode, ya que tengo el mismo proyecto compilando bien.

En mi archivo Foo.h tuve constructor y destructor que se implementa en el archivo .cpp. Pero también tuve otra clase que tuve en Foo.h cuya implementación fue en Foo.h y no en .cpp. Así que tuve que agregar el archivo Foo.h en el proyecto XCode -> Objetivos -> "NombreTraje" -> BuildSources y este problema fue resuelto.

Espero que esto ayude.

+0

hoy en día se llama "compilar fuentes" pero funcionó perfectamente para mí! – Mrlenny

5

En mi caso fue un método definido puro virtual en una clase base que fue declarado pero no se implementa en una clase derivada (y más específicamente el primer método virtual en el vtable), por ejemplo:

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;} 
}; 
Cuestiones relacionadas