2012-03-14 20 views
30

Escribo una biblioteca estática que tiene dependencias con otras bibliotecas (en mi caso, SBJSON y ASIHTTPRequest).Práctica recomendada para dependencias de bibliotecas estáticas

Si compilo estas dependencias externas en mi biblioteca, entonces no puedo enlazar con otras bibliotecas que tienen estas clases compiladas. Como mi objetivo es crear un conjunto de bibliotecas estáticas para mi empresa que se puedan importar a cualquier nueva aplicación, la compilación de estas dependencias en la biblioteca obviamente no es una opción.

¿Alguien tiene algún consejo/mejores prácticas para crear un conjunto de bibliotecas estáticas compartidas con dependencias comunes?

+0

Por qué no utilizan Dinamyc biblioteca en lugar? – LuisEspinoza

+0

bien, eso no es compatible – LuisEspinoza

+3

(A) Eso es bastante inútil a esta pregunta; mi problema es evitar los símbolos duplicados del enlazador. ¿Qué pasa con los símbolos de SBJSON? (B) No lo odian. Solo tienen una opinión al respecto. (C) ASI es una biblioteca comúnmente utilizada y probada en el mundo real: mi código es casi seguro que tiene más problemas. ¡Incluso la respuesta aceptada de la pregunta a la que se vincula tiene errores! – deanWombourne

Respuesta

9

Se puede usar un gestor de dependencia como CocoaPods o VendorKit para tirar en la biblioteca requerida, así como todas sus dependencias transitivas - bibliotecas que la biblioteca depende.

El administrador de dependencias es el encargado de gestionar cualquier conflicto en dependencias transitivas; por ejemplo, si dos bibliotecas usan versiones diferentes de SBJSON, se resolverá qué hacer. Todo lo que tiene que hacer es declarar la biblioteca de nivel superior que desea en un archivo de configuración y resolver qué sub-bibliotecas se necesitan y colocarlas en su proyecto de Xcode.

CocaoPods tiene una buena forma de gestionar esto al incorporar todas las bibliotecas como fuente y luego compilarlas todas en una sola biblioteca estática, en un proyecto separado. Esto se vincula a su proyecto a través de un área de trabajo.

VendorKit adopta un enfoque similar, pero utiliza un solo archivo de proyecto.

Tanto CocoaPods como VendorKit le permiten publicar fácilmente su biblioteca en un repositorio central. CocaoPods le permite mantener su propia bifurcación privada o pública del repositorio central, si lo desea, es decir, como un repositorio empresarial.

La mayor parte del tiempo esto te sacará de problemas. En casos excepcionales, su biblioteca puede depender de una versión más antigua y específica de otra biblioteca común. En este caso, podría usar una herramienta para cambiar el nombre de todos los archivos header/impl en esa biblioteca para evitar colisiones.

[Editar]: A partir de enero de 2013 también hay un nuevo contendiente - Maven Xcode plugin.

13

Una biblioteca estática es solo una colección de archivos de objeto. En su caso, no desea que los archivos objeto para SBJSON y ASIHTTPRequest se incluyan en su biblioteca estática; desea dejar ese trabajo en la aplicación final. Lo único que necesita su lib estática es los archivos de encabezado para SBJSON y ASIHTTPRequest.

Dado que estos proyectos se distribuyen como archivos de origen (archivos .h y .m) solo necesita decirle a Xcode que no cree los archivos SBJSON/ASIHTTPRequest .m para su objetivo de biblioteca estática.

La forma más fácil de hacerlo es importar solo los archivos de cabecera .h para estos proyectos en su proyecto de Xcode. Alternativamente, puede importar los archivos .h y .m, pero asegúrese de que.m archivos no están incluidos en las "Fuentes de compilación" fase de construcción de su blanco biblioteca estática

Algunos otros de los temas relevantes:

How can I avoid "duplicate symbol" errors in xcode with shared static libraries?

Duplicate symbol: Include static lib A in static lib B, also include lib A and B in XCode Project

+0

Pero, ¿qué sucede si mi lib estática usa una versión anterior de sbjson - 3.0.4, y el nuevo proyecto usa 3.1? tiene los mismos m archivos pero diferentes archivos h, o uno usa ARC y uno no? –

+0

Esta solución muy simple y adecuada debe ser la respuesta aceptada. ¡Gracias Ben por ahorrarme más dolores de cabeza con este problema! – thgc

Cuestiones relacionadas