0

Xcode で作成したコマンド ライン ツールをいくつかの Apple フレームワークにリンクしています。

「個人的な実験」として (動的ライブラリがどのように機能するかを少し理解しようとしているだけです)、実行可能ファイルを同じフレームワークの別のバージョンに向けようとしました。

たとえば、実行可能EXECLIB_Aを使用し、後者がLIB_Bを使用するとします。

LIB_ALIB_Bの両方のコピーを作成し、それらを別の (短い) ディレクトリ パスに配置しました。

以前otool -Lは、依存関係とライブラリの ID を取得していました。

次にinstall_name_toolwith ディレクティブ-idを使用して、新しいLIB_ALIB_Bの ID を変更しました (基本的には、名前が変更されていないため、先頭のパスを変更するだけです)。

次に、ディレクティブ-changeを使用して、新しい LIB_A が新しいLIB_Bを指すようにし、実行可能EXECが新しいLIB_Aを指すようにします

このようにして、依存関係ツリー全体が正しく再作成されているはずだと思いました。


install_name_toolエラーが返されず、実行可能ファイルと新しいライブラリを検査すると、otoolそれらはすべて正しいパスを指しています。

残念ながら、実行可能EXECを実行すると、クラスの重複定義に関する多くのエラーがコンソールにスローされます。古いライブラリと新しいライブラリの両方がロードされたように。

最後に、Trace/BPT トラップですべてがクラッシュします: 5

例えば:

objc[25992]: Class NSAppleEventManager is implemented in both 
             /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation and
             /xyz/Foundation.
             One of the two will be used. Which one is undefined.

私が呼び出す場合

export DYLD_PRINT_LIBRARIES=1

実行時に、実際にライブラリが 2 回読み込まれていることがわかります。

4

1 に答える 1

0

私は実際に残酷に設定することで問題を解決しました

export DYLD_LIBRARY_PATH=

それは私の特定の状況でうまくいきました。

于 2014-02-11T17:30:50.713 に答える