2011-12-04 32 views
12


Algunos antecedentes - He construido un marco personalizado utilizando la guía de Diney en http://db-in.com/blog/2011/07/universal-framework-iphone-ios-2-0/ld: Duplicar símbolo _objc_retainedObject en iOS 4.3, pero no en iOS 5.0

su base tanto para ARMv6/ARMv7, su un ARC basado en el marco, compilado con un objetivo de despliegue de 4.3.

Cuando pongo el marco resultante en un proyecto 5.0, funciona muy bien, pero cuando lo pongo en un proyecto 4.3 (ARC o no, no importa), obtengo lo siguiente que realmente no puedo entender. ..

También intenté agregar libarclite.a manualmente pero no cambió nada.

ld: Duplicar símbolo _objc_retainedObject en /Users/freak4pc/Project/MyFramework.framework/MyFramework y /Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a(arclite.o) para la arquitectura ARMv7 Comando /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang falló con el código de salida 1

agradecería cualquier ayuda en esto.
Gracias
Shai

+0

¿Por qué no crear una biblioteca estática como todos los demás para iOS? El enfoque al que te has vinculado parece algo así como un truco, por lo que no me sorprende que las cosas no se vinculen como se esperaba. –

+0

Uhm Acabo de recibir una sugerencia de que las bibliotecas estáticas no son tan flexibles. ¿Podrías vincularme a algunos recursos sobre esto quizás? –

+0

No estoy seguro de qué significaría "menos flexible" en este caso. Si tiene el código para su biblioteca, hay poca diferencia en el uso entre una biblioteca estática y un marco. Si está distribuyendo la biblioteca precompilada, todo lo que tiene que hacer es asegurarse de que los encabezados estén disponibles también. Para ver un ejemplo de esto, consulte la biblioteca de Core Plot: http://code.google.com/p/core-plot/, que usa un marco para Mac y una biblioteca estática para iOS. No recuerdo que sea difícil configurar la compilación de la biblioteca estática allí. –

Respuesta

15

Estoy luchando con el mismo problema. La solución es establecer el destino de implementación de su marco para iOS5 (sin embargo, compruebe si eso no causa otros problemas).

Entonces debe usar ARC en el proyecto maestro si se dirige a iOS4, de lo contrario, falta libarclite. Mi solución será suministrar dos marcos, dependiendo de si usan ARC o no.

Aquí hay dos enlaces a foros dev de Apple con un poco más de información: https://devforums.apple.com/message/539344#539344

https://devforums.apple.com/message/588316#588316

Actualización: hay una manera mejor. Simplemente construya su biblioteca estática con el objetivo mínimo de iOS5 y agregue manualmente /Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a (y /Developer/usr/lib/arc/libarclite_iphonesimulator.a) si su proyecto es no usando ARC y necesita compatibilidad con iOS4.

Actualización 2: En realidad, solo use la bandera del vinculador -fobjc-arc; esto vinculará libarclite con la biblioteca si aún no está allí. Mejor solución.

+0

¡No es una mala idea, le doy una oportunidad! Gracias ! –

+0

Gracias, es una mejor manera. agregue manualmente /Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a (y /Developer/usr/lib/arc/libarclite_iphonesimulator.a) – HelloWorld

2

¡Guau, fue un viaje difícil pero finalmente lo resolví!

Lo que provocó la idea final fue el comentario de @ steipete, Es una situación algo compleja, así que trataré de explicarlo a cualquiera que haya cruzado este tema también.

  1. La compilación de un marco compatible con ARC en iOS 4.3 adjuntará automáticamente libarclite.so para "puentear" 4.3 ARC con 5.0 ARC. Cuando este marco se importó a un proyecto 4.3, Arclite se vinculó dos veces: una para el marco (que es 4.3) y otra para el proyecto en sí, que causó el error de "símbolo duplicado", lo que significa que el marco debe compilarse en 5.0, y el proyecto puede ser 4.3. Pero entonces ;
  2. Mi marco está utilizando AFNetworking de @mattt para realizar solicitudes HTTP y análisis JSON de diferentes APis.AFNetworking comprueba automáticamente al compilar si su destino es iOS5, y si lo está, usa NSJSONSerialization, de lo contrario, recurriría a cualquier biblioteca JSON importada, como JSONKit.
  3. Al compilar mi Framework habilitado para AFNetworking para iOS5 (para evitar el problema no.1), se adjuntaría automáticamente NSJSONSerialization, lo que provocará una excepción en proyectos de 4.3, lo que significa que tendría que buscar manualmente las instrucciones de compilación y eliminar el llama al NSJSONSerialization antes de compilar, por lo que volvería automáticamente a la biblioteca compatible con 4.3 (en mi caso JSONKit). Esa condición de compilación se encuentra en AFHTTPClient.m y AFJSONRequestOperation.m (por ejemplo, #if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_4_3 || __MAC_OS_X_VERSION_MIN_REQUIRED > __MAC_10_6)
  4. Después de eliminar esas condiciones, compilé satisfactoriamente mi marco para iOS5 con JSONKit en lugar de NSJSONSerialization, y pude utilizarlo con éxito en mi iOS4.3 proyecto.

la esperanza que esto ayudaría a cualquier persona que pueda luchar con esto por un par de días como yo :)

Shai.

+0

Honestamente, no veo su respuesta agregando más valor (# 2, # 3 y # 4 ni siquiera son relevantes para la pregunta), por lo que deja un sabor amargo que marcó su propia respuesta como correcta. También se olvidó de explicar la problemática de que su proyecto maestro debe usar ARC si usa ARC sin agregar libarclite.so en un subproyecto, si necesita soportar iOS 4.x. – steipete

+0

Lo siento, pero realmente no estoy de acuerdo con usted. No tengo ningún problema en marcar su respuesta como "la correcta" (no obtengo puntos por marcar la mía), pero sí creo que mi respuesta es más completa ya que explica todo el proceso. 2-3-4 fueron lo que me causó no poder usar su propina, por lo que son MUY relevantes. Además, creo que es mi pregunta, por lo que me llama qué es relevante y cuál no es mi elección. Aprecio mucho tu ayuda, pero creo que tu comentario aquí estaba fuera de lugar. –

+1

Tengo que estar de acuerdo con steipete. Su "respuesta" puede ser relevante para su proyecto, pero es irrelevante para los problemas que estamos viendo. – wuf810

Cuestiones relacionadas