Frage

habe ich ein Projekt, dass der Bedarf zwei Bibliotheken von Drittanbietern zu integrieren, Liba und libb. Ich habe wenig, wenn überhaupt, über einen Einfluss auf die Bibliotheken von Drittanbietern. Das Problem dafür ist, dass beide Liba und libb umfassen verschiedene Versionen einer gemeinsamen Bibliothek, ASIHTTPRequest. Als Ergebnis erhalte ich Fehler wie:

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

, die ich kann nur annehmen, weil Liba zu libb Implementierung von ASIHTTPRequest bezieht (oder umgekehrt).

Ich habe versucht, mit strip -s <symbol file> -u <library> spiele rund um die Bibliotheken Symbole voneinander zu isolieren, sondern dass die Ergebnisse in Xcode Linker spucken Tausende von Warnungen und nicht behebt eigentlich nicht das Hauptproblem oben skizzierte.

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

In der Regel, wie kann / sollte man isolieren Bibliotheken voneinander?

War es hilfreich?

Lösung

Es gibt absolut keine Möglichkeit, dies zu tun. Eine Objective-C-Anwendung kann nur eine Bedeutung für ein Symbol zu einem Zeitpunkt. Wenn Sie die letzten zwei verschiedene Versionen einer Bibliothek laden die erste überschreibt.

Zwei Abhilfen:

  1. überzeugen die Entwickler eine neue Version zu verwenden,
  2. laufen beide Bibliotheken in separaten Prozessen

Andere Tipps

Wenn sie die gleichen Linker Symbolnamen für verschiedene Routinen verwendet, der einzige Ausweg (kurz ihre Objektdateien von Hacking), ist sie in verschiedene ausführbaren Dateien irgendwie zu verbinden.

Auf Plattformen, die Unterstützung dynamische Verknüpfung (zB DLLs) eine oder beide in eine separate DLL aufbauen könnte. Wenn sie nicht Teil der Schnittstelle der Symbole exportiert werden soll dann nicht kollidieren.

Sonst würden Sie stecken, sie in völlig getrennte Prozesse setzen und mit IPC-Daten zwischen ihnen zu übergeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top