Pregunta

Tengo un proyecto que tiene que incorporar dos bibliotecas de terceros, Liba y libB. Tengo poca, o ninguna, influencia sobre las bibliotecas de terceros. El ser problema es que tanto Liba y libB incluyen diferentes versiones de una biblioteca común, ASIHTTPRequest. Como resultado, estoy recibiendo errores como:

-[ASIFormDataRequest setNumberOfTimesToRetryOnTimeout:]: unrecognized selector sent to instance 0x3b4170

, que sólo puedo asumir que son Liba porque se refiere a la aplicación de libB de ASIHTTPRequest (o al revés).

He intentado jugar con strip -s <symbol file> -u <library> para aislar los símbolos de las bibliotecas entre sí, pero que da lugar a escupir enlazador de XCode a cabo miles de avisos y en realidad no solucionar el problema principal se describe anteriormente.

ld: warning: can't add line info to anonymous symbol anon-func-0x0 from ...

En general, ¿cómo se puede / debe uno aislar las bibliotecas de la otra?

¿Fue útil?

Solución

No hay absolutamente ninguna manera de hacerlo. Una aplicación de Objective-C sólo puede tener un significado para un símbolo a la vez. Si carga dos versiones diferentes de una biblioteca de la última se sobreponen a la primera.

dos soluciones:

  1. convencer a los desarrolladores para utilizar una versión reciente
  2. Ejecutar las dos bibliotecas en procesos separados

Otros consejos

Si ellos utilizan el mismo nombre de símbolo enlazador para diferentes rutinas, la única salida (por debajo de la piratería de sus archivos de objetos), es que los integran en diferentes archivos ejecutables de alguna manera.

En las plataformas que el apoyo de enlace dinámico (por ejemplo: DLL) se podría construir una o ambas en una DLL separada. Si no son parte de la exportado interfaz de los símbolos no debería enfrenta entonces.

De lo contrario, se quedaban atascados ponerlos en procesos totalmente independientes y el uso de IPC para pasar datos entre ellos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top