サードパーティの「C/C ++/OBJCライブラリ」のシンボルを互いに分離するにはどうすればよいですか?
-
01-10-2019 - |
質問
2つのサードパーティライブラリ、LibaとLibbを組み込む必要があるプロジェクトがあります。サードパーティライブラリに対する影響はほとんどありません。問題は、LibaとLibbの両方に、共通のライブラリのさまざまなバージョンであるAsihttpRequestが含まれていることです。その結果、次のようなエラーが発生しています。
-[ASIFormDataRequest setNumberOfTimesToRetryOnTimeout:]: unrecognized selector sent to instance 0x3b4170
, 、これは、LibaがLibbのAsihttprequestの実装(またはその逆)を指しているためです。
遊んでみました strip -s <symbol file> -u <library>
ライブラリのシンボルを互いに分離するためには、Xcodeのリンカーが何千もの警告を吐き出し、実際には上記の主な問題を修正しません。
ld: warning: can't add line info to anonymous symbol anon-func-0x0 from ...
一般に、ライブラリを互いに隔離するにはどうすればよいですか?
解決
そうする方法はまったくありません。 1つのObjective-Cアプリケーションは、一度に1つのシンボルに対して1つの意味を持つことができます。 1つのライブラリの2つの異なるバージョンをロードすると、最後のバージョンが最初のバージョンを上書きします。
2つの回避策:
- 開発者に最近のバージョンを使用するよう説得します
- 別々のプロセスで両方のライブラリを実行します
他のヒント
異なるルーチンに同じリンカー記号名を使用した場合、アウトの唯一の方法(オブジェクトファイルのハッキング以外)は、何らかの形で異なる実行可能ファイルにリンクすることです。
動的リンク(例:DLL)をサポートするプラットフォームでは、一方または両方を別のDLLに組み込むことができます。それらがエクスポートされたインターフェイスの一部でない場合、シンボルは衝突してはなりません。
それ以外の場合は、それらを完全に個別のプロセスに入れ、IPCを使用してデータを渡すためにそれらを使用してください。