update tools requisitos instalar developers code c++ iphone xcode

c++ - tools - xcode simulator



vtable para.. referenciado desde compilaciĆ³n error xcode (5)

El mismo error puede ocurrir cuando uno olvida poner el nombre de la clase delante de la definición de un método en el archivo cpp, como acabo de hacer. Y no es una cosa de xcode, estoy usando cmake para compilar y gcc como compilador (como suele hacer xcode).

Recibía el siguiente error al compilar un proyecto de iPhone. ¿Alguien sabe como puedo arreglarlo? "vtable for oned :: MultiFormatUPCEANReader", referenciado desde: __ZTVN4oned23MultiFormatUPCEANReaderE $ non_lazy_ptr en MultiFormatUPCEANReader.o ld: símbolo (s) no encontrado collect2: ld regresó 1 estado de salida


El problema parecía ser que en la clase MultiFormatUPCEANReader había declarado un constructor y destructor, pero no había escrito un cuerpo para el destructor, esto estaba causando este problema molesto. 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!


En general, este es el problema de vtable faltante: C ++ FAQ Lite 23.10 .

Desde el Archivo de Internet:

Si obtiene un error de enlace de la forma "Error: Se detectaron símbolos sin resolver o no definidos: tabla virtual para la clase Fred", es probable que tenga una función miembro virtual no definida en la clase Fred.

El compilador generalmente crea una estructura de datos mágica llamada "tabla virtual" para las clases que tienen funciones virtuales (así es como maneja el enlace dinámico). Normalmente no tienes que saberlo en absoluto. Pero si olvida definir una función virtual para la clase Fred, a veces obtendrá este error de vinculador.

Aquí está lo esencial: muchos compiladores ponen esta "tabla virtual" mágica en la unidad de compilación que define la primera función virtual no en línea en la clase. Por lo tanto, si la primera función virtual no en línea en Fred es wilma (), el compilador colocará la tabla virtual de Fred en la misma unidad de compilación donde ve a Fred :: wilma (). Desafortunadamente, si accidentalmente olvida definir Fred :: wilma (), en lugar de obtener un Fred :: wilma () no está definido, puede obtener una "La tabla virtual de Fred no está definida". Triste pero cierto.


En mi caso, fue un método virtual puro definido en una clase base que se declaró pero no se implementó 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;} };


Para mi fue una cosa XCode, ya que tengo el mismo proyecto compilando bien.

En mi archivo Foo.h tenía un constructor y un 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 -> "Nombre de Traget" -> BuildSources y este problema se resolvió.

Espero que esto ayude.