web-dev-qa-db-ja.com

Mac Os XのMach-Oライブラリにinstall_name_toolとotoolが必要なのはなぜですか?

Xcode 4の最新バージョンを使用してCocoaアプリケーションを開発しています。動的ライブラリをプロジェクト(dylibs)にリンクしたいと考えています。

プロジェクトにライブラリを追加するだけでは不十分で、install_name_toolおよびotoolを実行して、プロジェクトにバンドルされているライブラリをプロジェクトで使用する必要があることをどこかで読みました。

install_name_toolのマニュアルページを読みましたが、なぜこれを行う必要があるのか​​理解できません。

ライブラリはどのように機能しますか? /usr/local/lib/mylibrary.dylibの実行時のotool -Lのように、アプリケーションとライブラリがマシンの特定の場所を指すパスを持っている部分に特に関心があります。

37
Alex

アップルには、共有ライブラリを見つける方法がいくつかあります。

  1. @executable_path:メインの実行可能ファイルに対して相対的
  2. @loader_path:参照するバイナリとの相対
  3. @rpath:パスのリストのいずれかを基準にします。

@rpathは、OS X 10.5で導入された最新の追加機能です。

たとえば、実行可能ファイルをContents/MacOSに、ライブラリをContents/Librariesに入れたい場合は、次のようにします。

install_name_tool -id @rpath/Libraries/lib_this.dylib   builddir/lib_this.dylib

そして、トップレベルの実行可能ファイルセットrpathで、

install_name_tool -add_rpath @loader_path/..  myexecutable

そして:

install_name_tool -change builddir/lib_this.dylib @rpath/Libraries/lib_this.dylib myexecutable

注:-changeの後の最初のパスは、現在バイナリ内にあるものと正確に一致する必要があります。

紛失した場合、otool -l -v myexecutableは、実行可能ファイルに現在どのロードコマンドが正確に含まれているかを通知します。

詳細については、man dyldおよびman install_name_toolを参照してください。

63

すべての依存ライブラリを公開するMacDependencyという名前のGUIツールもあります( https://github.com/kwin/macdependency/ )。

10
Konrad Windszus