Xcode: consigue force_load para que funcione con routes relativas

Algunas bibliotecas requieren el distintivo -all_load linker cuando se vincula a un proyecto Xcode. Sin embargo, esto lleva a un error de linker si hay conflictos de símbolos entre bibliotecas. La solución es usar -force_load, que efectivamente le permite usar -all_load en algunas bibliotecas, pero no en otras.

Sin embargo, esto a su vez conduce a un nuevo problema, al less para mí. Cada vez que uso -force_load con una ruta relativa a una biblioteca, el linker siempre encuentra conflictos de símbolos entre la biblioteca y ella misma. Parece que el linker piensa que la biblioteca con su ruta absoluta y la biblioteca con su ruta relativa son bibliotecas diferentes y, por lo tanto, encuentra conflictos entre la biblioteca y ella misma.

Puedo evitar esto utilizando una ruta absoluta con la bandera. Pero esta no es una solución maravillosa, ya que es conveniente mantener el código fuente de las bibliotecas dentro de mi directory de documentos. Pero la ruta al directory de documentos será diferente en otras máquinas.

Pregunta: ¿Alguien puede forzar force_load para que funcione con una ruta relativa a la biblioteca?

EDITAR: para get información de background, consulte esta pregunta

Con Xcode 4, si incluye el proyecto de biblioteca en su proyecto de aplicación, puede agregar esto a los otros indicadores de vinculación:

-force_load $(BUILT_PRODUCTS_DIR)/<library_name.a> 

Todavía necesita la dependencia, y debe agregar la biblioteca en la list de frameworks y bibliotecas de Phase Phase también.

EDITAR: Apple ahora dice a partir de una versión de Xcode 4 que simplemente puede usar esta bandera de linker: "-ObjC" para get bibliotecas con categorías para cargar correctamente. Esa bandera funciona bien para mí en Xcode 5. La gente sigue votando esta respuesta, pero sospecho que la bandera -ObjC es la mejor solución ahora.

Esto funcionó para mí. Al igual que las respuestas anteriores, aún debe include la biblioteca en el proyecto.

 -force_load $(SRCROOT)/pathToLibraryFromProject/libname.a 

Para la ruta, solo las carpetas de su proyecto conducen a la location de su biblioteca, por ejemplo, BaseFoler / Subfolder / libName.a.