Xcode で作成したコマンド ライン ツールをいくつかの Apple フレームワークにリンクしています。
「個人的な実験」として (動的ライブラリがどのように機能するかを少し理解しようとしているだけです)、実行可能ファイルを同じフレームワークの別のバージョンに向けようとしました。
たとえば、実行可能EXECがLIB_Aを使用し、後者がLIB_Bを使用するとします。
LIB_AとLIB_Bの両方のコピーを作成し、それらを別の (短い) ディレクトリ パスに配置しました。
以前otool -L
は、依存関係とライブラリの ID を取得していました。
次にinstall_name_tool
with ディレクティブ-id
を使用して、新しいLIB_AとLIB_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 回読み込まれていることがわかります。