2010-05-26 16 views
14

Tengo dos bibliotecas de terceros que parecen usar la misma clase. Eso debería estar bien, pero me estoy haciendo este tipo de error en la construcción:¿Cómo manejar el error de símbolo duplicado de bibliotecas de terceros?

ld: duplicate symbol .objc_class_name_CJSONScanner in /Users/myappOne/TapjoyConnect/Frameworks/libTapjoyConnectSimulatorRewardInstall_Ads_Pinch.a(CJSONScanner.o) and /Developer/Projects/BuildOutput/Debug-iphonesimulator/OtherLibrary_d.a(CJSONScanner.o) 

¿Cómo puedo manejar este tema ...

- EDITAR -

... si el los archivos fuente no están disponibles?

Respuesta

0

Si tiene las fuentes para ambas bibliotecas estáticas, cree una de ellas sin la clase CJSONScanner. Si no lo hace, puede usar "ar" desde la línea de comando para extraer el CJSONScanner.o de una de las bibliotecas.

Probablemente haya alguna bandera mágica que pueda pasar a "ld" para arreglar esto, pero no lo sé de la mano.

+0

¿Qué significa "ar"? – user230949

+0

Simplemente, 'ar' es el nombre de una herramienta de línea de comandos. Si escribe 'man ar', verá información detallada, incluida una descripción de la funcionalidad:" crear y mantener archivos de la biblioteca ". La opción '-x' es para extraer, pero parece que querría que' -d' se elimine en su lugar. –

+0

Lo más probable es que estos archivos sean voluminosos y 'ar' por sí solo no será suficiente. También necesitará 'lipo' y' libtool' para hacer esto. –

31

Voy a suponer que se trata de dos bibliotecas de terceros que solo le proporcionaron los archivos .a y no el código fuente. Puede usar libtool, lipo y ar en la terminal para extraer y recombinar los archivos.

para ver qué arquitecturas están en el archivo:

$ lipo -info libTapjoy.a 
Architectures in the fat file: libTapjoy.a are: armv6 i386 

continuación para extraer simplemente ARMv6, por ejemplo:

$ lipo -extract_family armv6 -output libTapjoy-armv6.a libTapjoy.a 
$ mkdir armv6 
$ cd armv6 
$ ar -x ../libTapjoy-armv6.a 

continuación, se puede extraer la misma arquitectura de la otra biblioteca en la misma directorio y luego recombinarlos como así:

$ libtool -static -o ../lib-armv6.a *.o 

Y finalmente, af ter que haya hecho esto con cada arquitectura, se pueden combinar de nuevo con lipo:

$ cd .. 
$ lipo -create -output lib.a lib-armv6.a lib-i386.a 

Esto debe deshacerse de cualquier símbolo duplicados, sino que también va a combinar las dos bibliotecas en una sola. Si desea mantenerlos separados, o simplemente eliminar el duplicado de una biblioteca, puede modificar el proceso en consecuencia.

+0

Entonces, ¿significa esto que mi proyecto solo debería hacer referencia a lib.a y no a los otros dos archivos de la biblioteca? – user230949

+0

Si hiciera exactamente lo mismo que yo, entonces sí, eliminaría los otros dos archivos y usaría el nuevo. –

+0

Acabo de encontrar en una lib que estaba trabajando que tuve que llamar 'lipo -remove armv7' antes de llamar' lipo -extract_family armv6'. – Liron

1

La respuesta de Cory Kilger es la manera correcta de hacerlo ... solo una pequeña modificación ya que no tengo la reputación de comentar.

En mi sistema Mac OS 10.8, este comando lipo es el que he usado para hacer los archivos .a para su uso con AR:

lipo -thin armv6 -output libTapjoy-armv6.a libTabjoy.a 

La página del manual de lipo dice -Extracto y ambos producen -extract_family los archivos .a universales y mi comando ar no extraerán nada de ellos.

Cuestiones relacionadas