2012-01-06 11 views
24

Tengo un proyecto que no es de ARC que utiliza una biblioteca estática habilitada para ARC. Este es un escenario admitido, para que todo funcione bien. Es decir, hasta que ejecute el código en un dispositivo 4.x, incluido el simulador. En ese caso, el código explota con el siguiente error de vinculador:Biblioteca estática con compatibilidad ARC vinculada a un proyecto que no es ARC y que provoca errores de enlazador

dyld: lazy symbol binding failed: Symbol not found: _objc_storeStrong 
    Referenced from: /Users/zoul/Library/Application Support/iPhone Simulator/4.3.2/Applications/…/Demo.app/Demo 
    Expected in: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/Foundation.framework/Foundation 

Esto sucede tan pronto como una parte del código ARC habilitado intenta llamar _objc_storeStrong función, como en un método init (self = [super init]). La conversión del proyecto principal a ARC resuelve el problema, pero me gustaría saber si hay otras soluciones.

+0

¿Está enlazando usando LLVM que es compatible con ARC? – Krizz

+0

primero: la cadena de herramientas probablemente acaba de agregar una biblioteca para vincular cuando ARC está habilitado por el proyecto principal. si no puede ubicarlo en las transcripciones, entonces puede vincularlo al compilar una fuente con ARC. – justin

+1

¡Es una gran idea, @Justin! El truco con un solo archivo habilitado para ARC no funcionó, pero logré encontrar el argumento correcto para que el enlazador incluyera la biblioteca y parece funcionar. ¿Puedes complacer eso como una respuesta? Un simple hará, lo editaré para agregar los detalles. – zoul

Respuesta

30

Supuse que la cadena de herramientas puede haber agregado las bibliotecas necesarias para vincular, para que ARC funcione correctamente. Entonces, la transcripción del enlazador puede contener esta información. Si el proyecto de la aplicación en sí no está habilitado para ARC, puede que no los obtenga de manera predeterminada, pero aún así puede vincularlos definiéndolos explícitamente.

Al observar la transcripción de compilación, puede encontrar la bandera del enlazador apropiado allí: se llama -fobjc-arc (igual que la bandera del compilador relacionado). Cuando agrega esta configuración a otros indicadores de enlazador, el enlazador incluirá la biblioteca ARC con el producto de compilación principal y el código debería ejecutarse correctamente.

+0

Muchas gracias, esta respuesta fue un salvavidas después de una tarde tratando de resolver esto! – AliSoftware

+2

Esto ya no parece funcionar a partir de Xcode 4.3.2. '-fobjc-arc' parece ser un indicador no válido para la herramienta lib. ("carácter de opción desconocido' f 'en: -fobjc-arc ") –

+3

Puedo confirmar que esto funciona en Xcode 4.3.2. Simplemente lo hice, y el compilador no se quejó de nada cuando compiló para el simulador. – csotiriou

5

Agrego una nueva respuesta a esto ya que la solución aceptada anteriormente ya no parece funcionar con Xcode 4.3.2. Solo puedo suponer que la bandera del enlazador -fobjc-arc nunca se suponía que estuviera expuesta y ahora se ha eliminado.

Esto parece ser un problema conocido, aunque the only thread I can find on this con alguien de Apple comentando los devforums data de mediados de 2011. A partir de ese hilo, se sugiere que la vinculación de forma manual el archivo siguiente resuelve el problema:

${DEVROOT}/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a 

Esto requiere que esté compilando utilizando la última compilador/SDK sin embargo. Estoy enviando esta respuesta sin pruebas, vota por favor si funciona, ¡menos votos si no lo hace!

+0

Upvoting, ya que esta es una adición útil. No ha probado todavía – zoul

+1

DEVROOT no parece funcionar para mí. Utilicé: '$ (PLATFORM_DEVELOPER_USR_DIR)/lib/arc' en las rutas de búsqueda de la biblioteca y un marcador de enlazador específico del dispositivo para' -larclite_iphoneos' –

+0

Además útil, todavía tengo que encontrar la razón por la que solo agregué -fobjc-arc en las banderas enlazadoras todavía funcionan para mí en Xcode 4.3.2 – csotiriou

Cuestiones relacionadas