2012-08-27 26 views
7

Tengo un poco de un dilema. He agregado 2 marcos en mi proyecto y simplemente sucede que ambos usan JSONKit. Entonces cuando compilo mi proyecto obtengo símbolos duplicados entre estos 2 marcos.Cómo evitar símbolos duplicados entre frameworks de terceros

Tuve que agregar -ObjC -toda_carga en mis configuraciones de compilación, de lo contrario obtendría errores de ejecución (bloqueos) debido a que algunas categorías no se compilan.

¿Alguna idea?

+1

Si obtiene el código fuente, simplemente edítelo para que incluya JSONKit usted mismo y elimínelo de las fuentes del marco. Si solo obtiene bibliotecas estáticas, escriba a los responsables de mantenimiento y dígales que establezca un vínculo débil con JSONKit y que sea un requisito para utilizar su marco (esto es lo que deberían hacer de todos modos). –

+1

Sí, este es un gran problema. He visto bibliotecas que faltan a propósito otras terceras partes requeridas porque saben que entrarán en conflicto. Si está utilizando -ObjC -all_load, supongo que está utilizando archivos .a reales. Tal vez puedas solicitar a los escritores una versión sin esa biblioteca. – rooster117

+0

Sí, temía que esta fuera la resolución. Ojalá fuera más fácil evitar este conjunto de problemas. – MrShoot

Respuesta

2

Cuando vincule estática-biblioteca, el vinculador incrustará todos los símbolos en su binario final. (Es por eso que se llama static.) En realidad, no hay una buena manera de quitarse símbolos específicos, porque no hay diferencia entre los símbolos fuente y los símbolos recién incorporados. Incluso puedes quitar símbolos duplicados, nadie puede estar seguro de que los símbolos duplicados sean la misma versión. Si una biblioteca usó una versión modificada de la biblioteca JSONKit, se romperá cuando la reemplace con otra versión.

La única forma es obtener el archivo .a sin los símbolos duplicados u obtener la fuente y compilarlos usted mismo. Si los creadores de lib no son idiotas, deberían ofrecer alguna versión de biblioteca sin símbolos incrustados. Si no existe tal cosa, recomiendo no usar esa lib. Porque no tiene ninguna preocupación por el conflicto de símbolos que significa hecho por un novato real, lo que significa que está lleno de problemas.

Cuestiones relacionadas