¿Cómo resolver el símbolo de dublicar en un marco de terceros en ios?

Estoy desarrollando el inicio de session de Amazon y la participación de Google Plus en mi proyecto. Agregué el marco de Amazon y Google plus en mi proyecto. Cuando bash crear un proyecto, muestra el error "Duplicar símbolo en GooglePlus y Amazon Framework".

Mensaje de error

duplicate symbol _kClientId in: /Users/test/Amazon/Apps-SDK/iOS/LoginWithAmazon/LoginWithAmazon.framework/LoginWithAmazon(AIConstants.o) /Users/test/GooglePlus/google-plus-ios-sdk-1.5.1/GooglePlus.framework/GooglePlus(GPPOzLogger.o) ld: 1 duplicate symbol for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation) 

¿Cómo resolver este tipo de error?

Todo lo que puedes hacer es contactar a Google y / o Amazon y decirles que arreglen sus frameworks conflictivos. Es una especie de tontería que ambos usen un nombre de símbolo global como _kClientId en sus frameworks cuando las posibilidades de que ocurra un conflicto con un nombre como ese son extremadamente altas. Los nombres realmente deberían ser algo así como _kGooglePlus_iOS_Framework_ClientId y _kAmazon_iOS_Framework_ClientId para cada marco respectivo para networkingucir las posibilidades de colisión de nombres de símbolos.

O haga eso o use un marco o biblioteca diferente para Google Plus o Amazon, si puede. O si no puede hacer eso, use un editor HEX para cambiar manualmente todas las references al símbolo _kClientId en uno de los frameworks.

Me he enfrentado al mismo problema hace algunas veces. Y finalmente he descubierto cómo resolver esto. Como cliente de la biblioteca no podemos evitarlo, pero aún tenemos posibilidades de lidiar con ella. Mi respuesta incluye dos partes, una para describir el problema, una para resolver este problema como cliente de framework (Esto significa que tenemos que resolver esto por nuestra count y no pedirle al desarrollador de framework que lo haga).

1) ¿Cómo ocurrió la colisión y qué significa el error del enlace?

Un marco es una carpeta en realidad, ingrese al marco encontrará un file lib. A veces, el file lib tiene una extensión de * .a o simplemente no tiene extensión. La estructura de un file lib se ve a continuación:

 libFoo.a / i386 / hello.o world.o arm64 / hello.o world.o 

En este caso, un libFoo.a es una biblioteca de grasa, eso significa que contiene varias architectures. El error del enlace le indica que tiene dos bibliotecas que contienen el mismo file .o (símbolos) en la misma architecture.

por ejemplo de su caso:

 duplicate symbol _kClientId in: /Users/test/Amazon/Apps-SDK/iOS/LoginWithAmazon/LoginWithAmazon.framework/LoginWithAmazon(AIConstants.o) /Users/test/GooglePlus/google-plus-ios-sdk-1.5.1/GooglePlus.framework/GooglePlus(GPPOzLogger.o) ld: 1 duplicate symbol for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Esto significa que en los dos frameworks, tiene files duplicates .o en la architecture i386.

2) Cómo resolver el problema.

Necesitamos algunas herramientas para resolver esto. Por suerte, deberías tener esas herramientas instaladas en tu computadora. Lo que tenemos que hacer es abrir un marco y hacer alguna cirugía para eliminar el símbolo duplicado y cerrarlo.

Demostré el process aquí para eliminar el símbolo duplicado AIConstants.o en LoginWithAmazon bajo la architecture i386:

 lipo -info LoginWithAmazon //this is going to show us the architectures in the fat library lipo LoginWithAmazon -thin i386 -output LoginWithAmazon-i386 //we extract the i386 architecture as xxx-i386 from fat library //use the same command to extract every architecture from fat libraray as xxx-archname ar -t LoginWithAmazon-i386 // list of symbols in this architecture, we should see AIConstants.o in it ar -d LoginWithAmazon-i386 AIConstants.o // delete AIConstants.o from LoginWithAmazon-i386 //now work is done, we put everything back to the fat library lipo LoginWithAmazon-i386 LoginWithAmazon-arm64 <every architecture you extracted from the fat library> -create -output LoginWithAmazon-new ranlib -s LoginWithAmazon-new //sometime we need to rebuild the symbol table //now you have done the work, use LoginWithAmazon-new to replace the old LoginWithAmazon, and try to compile your program again 

ÁRBITRO:

http://blog.sigmapoint.pl/avoiding-dependency-collisions-in-ios-static-library-managed-by-cocoapods/

Parece que este problema no es una prioridad para el inicio de session con el equipo amazon.

Como solución temporal (créalo o no) puede usar un editor de text y replace todas las apariciones de "_kClientId" en el binary LoginWithAmazon con algo más (como "_kClientIe").

Vea también mi respuesta aquí:

https://github.com/aws/aws-sdk-ios/issues/18