2011-10-30 6 views
7

Tengo proyecto con una dependencia en una biblioteca estática de un tercero y las tres bibliotecas. En XCode 3.X, para hacer que mi proyecto se compilara, tuve que usar el indicador -force_load en la configuración de compilación "Other Linker Flags" y especificar cada una de las tres20 bibliotecas que quería incluir.¿Por qué -force_load ya no es necesario para mis tres20 dependencias en XCode 4.2?

Al intentar crear un archivo en XCode 4.2, recibí un error de "símbolo duplicado". Resolví esto eliminando los siete indicadores independientes deforceforce que se referían a cada una de las tres bibliotecas de las cuales tenía una dependencia.

Mi proyecto ahora se crea con éxito.

Me pregunto si alguien puede explicarme por qué este cambio funcionó. ¿Hubo un error que XCode 4.2 solucionó, o es un cambio de comportamiento? This post suggests había un error en XCode 3.2, pero sería genial si alguien pudiera arrojar más luz sobre este tema para mí, así puedo estar seguro de que no he podido hacer algo mal al eliminar estos -force_load flags.

Gracias!

Respuesta

19

Al compilar una biblioteca estática (como se requiere para iOS), uno de los problemas que encontrará es cómo incluir símbolos de categorías en esa biblioteca para que puedan ser utilizados por una aplicación. El indicador del enlazador -ObjC debe incorporar suficiente información para incluir categorías en estos marcos integrados, como describe Dave Dribin en su artículo here.

Sin embargo, entre iPhone OS 2.0 y 3.0, esto dejó de funcionar correctamente. Como mencioné en this answer, encontramos este problema en el marco de Trazado central y descubrimos que necesitábamos agregar el indicador del enlazador -all_load para que el marco funcionara correctamente. Manzana mismos publicada Technical Q&A QA1490 que menciona este tema:

Para aplicaciones iPhone OS de 64 bits y, hay un error enlazador que impide -ObjC de carga de objetos archivos de bibliotecas estáticas que contienen sólo categorías y no hay clases. La solución consiste en utilizar los indicadores -todos_carga o -force_load.

-all_load obliga al enlazador a cargar todos los archivos de objeto de cada archivo que ve, incluso aquellos sin código Objective-C. -force_load es disponible en Xcode 3.2 y posterior. Permite un control de grano más fino de la carga del archivo . Cada opción -force_load debe ir seguida de una ruta al archivo , y se cargarán todos los archivos de objetos de ese archivo.

Desafortunadamente, el efecto secundario de esto es que los símbolos duplicados vinculados desde varias bibliotecas pueden causar errores como los que experimentó.

Archivé un informe de error acerca de esto (en 2009), y parece que la última versión de LLVM ahora utilizada en Xcode ya no sufre de este error de enlazador. Intenté simplemente usar -ObjC con el objetivo de biblioteca estática de Core Plot iOS y funciona bien ahora. Esas son buenas noticias.

+0

Genial, así que definitivamente fue un error, y empíricamente parece que se ha corregido (aunque Apple no ha anunciado nada ...) ¡Gracias! – esilver

+0

Creo que todavía necesita -ObjC para cargar Categorías, y esto aún le dará error de "símbolo duplicado" si lo hace, intacto tiene símbolos duplicados, ¿verdad? – hooleyhoop

+1

@hooleyhoop - Correcto, como dije anteriormente, usted todavía necesita -ObjC para las categorías, pero en mi experiencia al eliminar el indicador de enlazador '-all_load' se deshace de casi todos los errores de símbolos duplicados que ve. Si mal no recuerdo, muchos de esos símbolos provienen de marcos que se vincularon en más de una biblioteca estática, luego ambas bibliotecas estáticas se utilizaron en la misma aplicación. Por supuesto, '-ObjC' no lo protegerá contra el caso en que las diferentes categorías definen el mismo nombre de método como una extensión para la misma clase, pero las convenciones de nomenclatura adecuadas deberían evitarlo. –

Cuestiones relacionadas