Como lidar com erros de símbolo duplicados de bibliotecas de terceiros?

Eu tenho duas bibliotecas de terceiros que parecem usar a mesma class. Isso deve ser bom, mas estou recebendo esse tipo de erro ao criar:

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) 

Como posso lidar com esse problema …

– EDIT –

… se os arquivos de origem não estiverem disponíveis?

Suponho que essas são duas bibliotecas de terceiros que apenas forneceram a você os arquivos .a e não o código-fonte. Você pode usar libtool, lipo e ar no terminal para extrair e recombinar os arquivos.

Para ver quais arquiteturas estão no arquivo:

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

Então para extrair apenas armv6, por exemplo:

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

Você pode então extrair a mesma arquitetura da outra biblioteca para o mesmo diretório e depois recombiná-las da seguinte forma:

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

E finalmente, depois de fazer isso com cada arquitetura, você pode combiná-los novamente com lipo:

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

Isso deve se livrar de quaisquer símbolos duplicados, mas também combinará as duas bibliotecas em uma. Se você quiser mantê-los separados, ou apenas excluir o duplicado de uma biblioteca, você pode modificar o processo de acordo.

A resposta de Cory Kilger é o caminho certo a seguir … apenas um pequeno ajuste desde que eu não tenho a reputação de comentar.

No meu sistema Mac OS 10.8, esse comando lipo é o que usei para criar os arquivos .a para uso com ar:

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

A página man do lipo diz -extract e -extract_family, ambos produzem arquivos .a universais e meu comando ar não extrai nada deles.

Se você tiver as fonts para as duas bibliotecas estáticas, construa uma delas sem a class CJSONScanner. Caso contrário, você pode usar “ar” na linha de comando para extrair o CJSONScanner.o de uma das bibliotecas.

Há provavelmente alguma bandeira mágica que você pode passar para “ld” para consertar isso, mas eu não sei disso.