2

libAとlibBの2つのサードパーティライブラリを組み込む必要があるプロジェクトがあります。サードパーティのライブラリに影響を与えることはほとんどありません。問題は、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 ...

一般に、ライブラリを相互に分離するにはどうすればよいですか?

4

2 に答える 2

1

そうする方法は絶対にありません。1つのObjective-Cアプリケーションは、一度に1つのシンボルに対して1つの意味しか持つことができません。1つのライブラリの2つの異なるバージョンをロードすると、最後のバージョンが最初のライブラリを上書きします。

2つの回避策:

  1. 開発者に最新バージョンを使用するように説得する
  2. 両方のライブラリを別々のプロセスで実行する
于 2010-08-24T16:09:58.410 に答える
0

異なるルーチンに同じリンカーシンボル名を使用した場合、(オブジェクトファイルをハッキングする以外の)唯一の方法は、それらを何らかの方法で異なる実行可能ファイルにリンクすることです。

ダイナミックリンクをサポートするプラットフォーム(例:DLL)では、一方または両方を別のDLLに組み込むことができます。それらがエクスポートされたインターフェースの一部でない場合、シンボルは衝突しないはずです。

そうしないと、それらを完全に別個のプロセスに配置し、IPCを使用してそれらの間でデータを渡すことに行き詰まります。

于 2010-08-24T16:10:14.570 に答える