2012-02-23 10 views
8

mi problema

que conseguir "_OBJC_CLASS _ $ ..., referenciado a partir de:" error de vinculador al compilar algunos proyectos Xcode (ocurre en ambos iOS y proyectos de Mac) marcos y las importaciones lo han vinculado correctamente.

de configuración

  • un objetivo aplicación
  • Uno de los objetivos de prueba
  • Todos los marcos vinculados correctamente

En compilación Puedo obtener los siguientes errores de enlace: "_OBJC_CLASS _ $ _ JGCountdownTimer" , a la que se hace referencia en: objc-class-ref en JGCountdownTimerTestCase.o

para muchas clases que se utilizan en las pruebas.

lo que he tratado

  • comprobado que las importaciones están todos presentes
  • no han eliminado todos los marcos estándar
  • Si puedo compilar una clase, tanto para el destino de la prueba y la aplicación de destino que fija la cuestión. Pero luego recibo otras advertencias del compilador.
+2

En su blanco - Construir comprobar si el archivo Fase JGCountdownTimer.m falta? – 0x8badf00d

+0

Como estoy seguro que sabes, esto significa que el nombre (JGCountdownTimer) se usó durante el proceso de compilación, pero durante el enlace, no se encontró el archivo del objeto. ¿JGCountdownTimer proviene de un archivo binario o de clase? La única vez que tuve un problema con esto fue debido a la referencia circular. ¿Podría ser ese el caso? Si es así, use la directiva @class. Buena suerte. – Avi

+0

Hola chicos, gracias por comentar. Solucioné el problema antes de publicarlo, pero no pude encontrar ninguna otra publicación con la respuesta que encontré, así que planteé una pregunta para poder responderla y tener una respuesta autorizada. –

Respuesta

11

respuesta rápida

Copiar y pegar la siguiente línea en los valores de creación:

GCC_SYMBOLS_PRIVATE_EXTERN = NO

En el objetivo de configuración de generación buscan "Símbolos ocultos por defecto" . Para la configuración de depuración, quiere "No".

He tenido este problema de forma intermitente durante muchos meses y acabo de descubrir por qué.

+1

También puede prefijar su '@ interface' con' __attribute __ ((visibility ("default"))) ' – Wevah

+0

Hmmm. Bonito. Tu aprendes algo nuevo cada dia. ¡Gracias! –

+11

¿En la configuración de construcción dónde pegar esa cosa de GCC? –

2

No estoy seguro de si este podría ser el problema, pero con el nuevo compilador, cualquier obj-c que no esté explícitamente referido/invocado no se vinculará desde las bibliotecas. Esto causa problemas cuando implementa categorías en bibliotecas, por ejemplo.

Intente agregar '-ObjC' a 'indicadores de vinculador adicionales' en el panel de configuración de compilación para su destino. encogimiento

+0

Gracias por la respuesta rápida. Estaba publicando esto porque en realidad encontré la solución y me volví loca porque no pude encontrar la respuesta en ningún otro lugar, así que pensé en publicarla aquí para algún otro alma desventurada que obtenga este error del enlazador y no puede entender por qué. –

+2

Esta respuesta es un poco engañosa. Al vincular bibliotecas estáticas, de forma predeterminada, el compilador (gcc y clang) solo vinculará miembros de la biblioteca a los que se haga referencia de alguna manera. Especificar el indicador del enlazador '-ObjC' significa vincular a todos los miembros que tienen información de clase/categoría Obj-C. Esto no afecta para nada a los dylibs, o código de aplicación, solo libs estáticos. –

+0

oh oops. parece que estás usando GCC de todos modos, ¿verdad? – nielsbot

10

Me enfrenté a un problema similar. Tengo el error de vinculador:

_OBJC_CLASS_$_MyClass

El problema era que había declarado una @interface para MyClass pero no había declarado su correspondiente @implementation.

La solución era simplemente agregar

@implementation MyClass 
@end 
Cuestiones relacionadas