10

-change私はしばらくの間、この概念に苦労してきましたが、との違いが本当に理解できません-id

 -id name
              Changes  the  shared  library identification name of a dynamic shared library to name.  If the Mach-O binary is not a dynamic
              shared library and the -id option is specified it is ignored.

-change old new
              Changes  the dependent shared library install name old to new in the specified Mach-O binary.  More than one of these options
              can be specified.  If the Mach-O binary does not contain the old install name in a specified -change  option  the  option  is
              ignored.

これまでのところ、私は で実験しまし-changeた。次の構造があるとします

Test.App
|_Contents
    |_MacOS
    |   |_test -----> item A
    |_Library
        |_test_library.dylib     --->item B
        |_another_library.dylib  --->item C

ここで、itemB で次のコマンドを実行したとします。

$ otool -L test_library.dylib
   test_library.dylib
   /some/path/another_library.dylib  -->item D

上記の結果は、場所を変更する必要があるかどうかに応じて、test_library.dylibこれを行うことを示していますanother_library.dylibanother_library.dylib

install_name_tool -change /some/path/another_library.dylib some/new/path/another_library.dylib  test_library.dylib 

これにより、アイテムDの場所が変更されます。私の質問は、何install-name_tool -idをし、いつそれを使用するのですか?

4

3 に答える 3

11

インストール名

インストール名という用語.dylibは、実行時リンカーが動的ライブラリを見つけてロードできるように、エンドユーザー システム内のファイルの正確なパスを指します。

名前は次のいずれかです。

  • システム ライブラリの場合は絶対です。これらは、エンドユーザーと開発者の両方のシステムで同じ場所にあります。
  • 相対。これは、アプリにバンドルされているライブラリの場合です。エンド ユーザーのシステム.dylibでは、アプリ バンドルに埋め込まれ、開発者システムでは、事前にビルドされているか、別の場所にあるか/usr/local/opt/localまたはアプリ ビルドの一部としてソースからビルドされます。

.dylibがビルドされると、そのインストール名がリンカーによってスタンプされ.dylib、実行時にそこから検出されてロードされることが期待されるため、後者が主な問題です。そのパスは開発者のシステムにのみ存在するため、明らかにこれはエンドユーザーのシステムでは機能しません。そのため、解決策は、ライブラリのインストール名と、それらのライブラリを参照する実行可能ファイルを、アプリ バンドルをまとめるときにinstall_name_tool変更するために使用することです。 .

プレースホルダー

実行可能ファイル/アプリ バンドルはエンド ユーザー システムのさまざまな場所にインストールできるため、プレースホルダー システムを使用してインストール名の場所を抽象化できます。

  • @executable_path: メインの実行可能ファイルのフル パス。
  • @loader_path: 参照元の実行可能ファイルのフル パスまたは.dylib.
  • @rpath: メインの実行可能ファイルに設定された RPATH。これは、 を使用して変更することもできますinstall_name_tool

たとえば、macOS アプリ バンドルでは、実行可能ファイルが含まれTheApp.app/Contents/MacOS/TheApp、ライブラリが含まれるTheApp.app/Contents/Frameworksため、パスを使用してライブラリを参照する必要があります@executable_path/../Frameworks/Library.dylib

ただし、メインの実行ファイルの RPATH を に設定し@executable_path/../Frameworks、 を使用してライブラリを参照することをお勧めし@rpath/Library.dylibます。

install_name_tool

install_name_tool2 つの主なオプションがあります。

-id: これは、ファイル自体のインストール名設定し、それ以降、何かが. をビルドした直後にインストール名を「修正」することもできますが、ライブラリがそれを使用している環境についてどのように知るのでしょうか?.dylib.dylib.dylib

-change: これにより、参照している実行可能ファイル (または dylib) 内ののインストール名が変更されます。.dylib

-id名前が名前と一致しない場合はどうなり-changeますか? 何もない。このオプションは、実行時リンカーが目的を達成したこと-changeを発見したら、適切に処理するための重要なオプションです。.dylib

xcodedevtools

スクリプトを使用してすべての修正をスクリプト化することは明らかですが、それは少し面倒なので、copy_dylibs.pyスクリプトを作成してすべてを実行します。アプリの実行可能ファイルをリンクした後に実行するように構成すると、実行可能ファイルを調べ.dylibて、アプリ バンドルにコピーするファイルを再帰的に見つけます。次に、元のファイルをそのままにして、インストール名を修正します。.dylib

于 2016-02-05T09:14:15.743 に答える