2011-03-09 13 views
10

He estado tratando de crear un conjunto de bibliotecas reutilizables para el desarrollo de aplicaciones, pero estoy empezando a encontrarme con un problema.Símbolo duplicado: Incluir la lib estática en B estática, también incluir lib A y B en el Proyecto XCode

Una de mis bibliotecas estáticas es un conjunto de métodos de uso general (categorías en Objective-C Foundation clases para mejorar su usabilidad) que tiendo a usar en cada proyecto. (Lo llamaremos Lib A ... es decir, el proyecto A de XCode produce libProjectA.a)

Luego tengo otras bibliotecas estáticas, cosas que contienen código especializado para matemáticas, etc. (Lo llamaremos Lib B.) Lib B se vincula a Lib A porque necesita usar parte de esa funcionalidad general. (es decir, el proyecto XCode enlaces B con libProjectA.a y produce libProjectB.a)

En mi proyecto XCode, quiero incluir y depender de Lib A porque tengo mis cosas de uso general que utilizo todo el tiempo. También quiero incluir y depender de Lib B porque necesito esa funcionalidad matemática especializada. (es decir, mi aplicación Proyecto quiere vincular con libProjectA.a y libProjectB.a)

Sin embargo, cuando intento construir mi proyecto XCode recibo errores para los símbolos duplicados, porque los símbolos que están definidos en Lib A también se definen en Lib B.

ld: duplicate symbol _OBJC_METACLASS_$_Foo in /Users/kenny/xcode_build/Release-iphonesimulator/lib_ApplicationCore.a(Foo.o) and /Users/kenny/xcode_build/Release-iphonesimulator/lib_SpecializedMath.a(Foo.o) 

¿Cómo puedo solucionar este problema? Deseo desarrollar bibliotecas reutilizables para acelerar el desarrollo de mi aplicación y aumentar la estabilidad a través de un código probado/refinado. ¿Me estoy acercando a esto desde una perspectiva equivocada? Estoy desarrollando para iOS, así que no puedo usar dylibs, deben ser estáticos.

¿Cómo puedo incluir estas bibliotecas en mi proyecto cuando son interdependientes entre sí y evitar los símbolos duplicados?

+2

No tiene sentido que el proyecto B se vincule con Lib A a pesar de lo extraño que le parezca. Si fueran bibliotecas dinámicas, está bien, pero son bibliotecas estáticas, es decir, archivos de archivos de objeto, nada más. Al "enlazar" contra lib A está ordenando al archivador que tome todos los objetos de lib A y los agregue a todos los objetos del proyecto B. – Troubadour

Respuesta

7

Aunque Lib B depende de Lib A, en realidad no quiere poner todos los objetos de A en B, que es lo que ha hecho por su aspecto. No estoy seguro de cómo lo lograste, pero me imagino que cuando construyeste Lib B vinculaste contra Lib A? Si es así, simplemente omita Lib A de la línea de compilación para Lib B. Todos los símbolos de Lib A están destinados a ser indefinidos en Lib B.

Las bibliotecas estáticas son solo archivos de archivos de objetos por lo que las dos deben estar completamente separadas. Cuando necesite vincular contra Lib B solo especifique Lib A también.

+0

¿Qué quiere decir con "poner todos los objetos de A en B?" No estoy copiando el código en absoluto. Mi proyecto XCode que crea lib B lo vincula con lib A. Luego, mi proyecto XCode para mi aplicación se vincula con Lib A y Lib B. Actualicé mi pregunta para aclarar cómo están vinculados los interproyectos. –

+1

Al vincular lib B con lib A, toma efectivamente todos los objetos que están archivados en lib A y los coloca en lib B. Con lo que termina es realmente "lib A y B". No vincule contra lib A al construir el archivo lib B. – Troubadour

+0

¡Oh! * facepalm * Pensé que mi proyecto de aplicación también tenía que vincular directamente con lib A, pero supongo que solo necesito que el proyecto de la aplicación sepa dónde están los archivos de encabezado. ¡Gracias!Eso funcionó maravillosamente. –

Cuestiones relacionadas