ios xcode static-libraries cocoapods

ios - Construyendo una biblioteca estática con cocoápodos.



xcode static-libraries (3)

Estoy tratando de construir una biblioteca estática que tenga diferentes dependencias (AFNetworking, por ejemplo) especificada en un Podfile. No quiero que las dependencias se incluyan en la biblioteca estática final (llame a libMyProject.a), solo quiero vincularlas y luego crear un archivo MyProject.Podspec donde pueda colocar las mismas dependencias.

El problema es que cuando compilo libMyProject.a, libPods.a está vinculado e incluido, de modo que si distribuyo libMyProject.a y otras personas lo integran en un proyecto que utiliza algunas de las mismas dependencias, tendrá problemas de símbolos duplicados.

¿Cómo puedo enlazar con libPods.a lib pero no incluirlo en libMyProject.a? Debería funcionar igual que enlazar con otros marcos existentes.

¡Gracias!


Las bibliotecas a las que se hace referencia no se incluyen (de forma predeterminada) en el producto de biblioteca estática. El conflicto de vinculador que está viendo es más probable que sea el resultado tanto de su biblioteca estática como de la aplicación cliente que utilizan el objetivo predeterminado (implícito) de Pod.

Cada destino generado por Cocoapods incluye un archivo "Pods- target -dummy.m" que se compila en el producto; Si usas el objetivo predeterminado de Pods, simplemente se llama "Pods-dummy.m". Cuando tanto la biblioteca como el cliente utilizan el destino predeterminado, los símbolos idénticos producidos al compilar los archivos ficticios causarán un error de enlace.

link_with una variante de la respuesta de Craig y descubrí que la declaración link_with también es responsable de conectar el xcconfig generado por Cocoapods, que proporciona los indicadores del compilador que controlan la ruta de búsqueda del encabezado. Por supuesto, puede agregar el xcconfig (o la configuración del proyecto de ruta de búsqueda de encabezado), pero busqué una solución repetible para mi equipo.

Mi solución es crear un destino explícito para la biblioteca, con un nombre que probablemente no genere conflictos con el proyecto de un cliente (por ejemplo, el nombre de la biblioteca):

target ''XYZLibrary'' do pod ''AFNetworking'', ''2.5.2'' ... end

Puede incluir una declaración link_with dentro del bloque de target si el nombre del destino de la biblioteca estática (en su proyecto Xcode) es diferente, pero si solo hay un objetivo, generalmente prefiero usar el mismo nombre en ambos lugares, haciendo que link_with innecesario.

Si tiene un objetivo de prueba de unidad, cree dos objetivos separados. (Actualmente def un conjunto de pods comunes que se usan en ambos objetivos, ya que los objetivos abstractos no son actualmente una opción, pero pueden ser un día). Se parece a esto:

def common_pods pod ''AFNetworking'', ''2.5.2'' end target ''XYZLibrary'' do common_pods end target ''XYZLibraryTests'' do common_pods end

La clave es no tener ningún elemento de pod en la raíz del Podfile, para que Cocoapods no genere un objetivo predeterminado. De esa manera, cada producto obtiene un "Pods- target -dummy.m" único, y no hay conflicto cuando esos archivos de objetos están vinculados entre sí.


Lo resolví eliminando libPods.a lib de la sección "Vincular binarios con bibliotecas" en Fases de compilación.


Si bien la eliminación manual de libPods.a de la fase de compilación "Vincular binarios con bibliotecas" realmente funciona, la respuesta real es no permitir que se agregue allí en primer lugar.

La razón por la que se agrega es porque el comando pod install está encontrando el destino de la biblioteca estática como uno de sus destinos para vincularlo. Esto podría deberse a que es el primer objetivo de la lista (la implementación de cocoapods hace que elija el primero si no ha especificado explícitamente los objetivos) o podría deberse a que lo ha indicado explícitamente en la sección ''link_with''.

La respuesta que encuentro es usar la sección link_with del Podfile para indicar explícitamente sus objetivos y omitir el objetivo de la biblioteca estática .

El proyecto de pods aún se crea y las dependencias se traen allí como usted esperaría, pero los libPods.a no se agregan a la fase de compilación de su biblioteca estática.

El único problema es qué poner en la sección link_with, si no es su biblioteca estática. Si tiene otros objetivos con los que desea vincularse (por ejemplo, un objetivo de la aplicación de iPhone) es una buena opción. Pero si su único destino real es su biblioteca estática, necesita un poco de solución.

Mi estrategia exitosa hasta ahora ha sido crear un objetivo de biblioteca estática (sí, uno separado de su biblioteca estática principal ) y llamarlo "Dummy". Especifique este objetivo en la sección link_with de su Podfile.

Es un poco desagradable, concedido, pero funciona.

platform :ios, ''5.1.1'' link_with [''Dummy''] pod ''AFNetworking'', ''= 1.3.1''