37

dylib を正常に呼び出すアプリケーション (実行可能ファイル) を作成しました。ただし、dylib ファイルと実行可能ファイルは別のディレクトリにあります。dylib ファイルを含むディレクトリを$PATH環境変数に追加しました。ただし、まだ読み込まれません。すべての dylib ファイルを実行可能ファイルにコピーすると、プログラムが最終的に実行されます。これにより、dylib ファイルに問題がないことが確認されます。ただし、OSにそれを見つけるように指示するにはどうすればよいですか?
Windows では、dll ファイルを含むディレクトリ パスを $PATH に追加するだけです。Mac OS X では何をする必要がありますか?

4

4 に答える 4

40

Justin が提供したリンクを読んだ後、@executable_pathトークンを使用して dylib install_name を変更し、実行可能ファイルが配置されているのと同じディレクトリを指すようにすることに成功しました。

@executable_path絶対パスは面倒です。フレームワークを /Library または同様の場所にインストールする代わりに、フレームワークをアプリケーションに組み込みたい場合があります。

これに対する Mac のソリューションは @executable_path です。これは、ライブラリのインストール名の先頭に置かれると、それをロードしている実行可能ファイルのパスから最後のコンポーネントを引いたものに展開される魔法のトークンです。たとえば、Bar.app が Foo.framework に対してリンクしているとします。Bar.app が /Applications にインストールされている場合、@executable_path は /Applications/Bar.app/Contents/MacOS に展開されます。フレームワークを Contents/Frameworks に埋め込む場合は、Foo.framework のインストール名を @executable_path/../Frameworks/Foo.framework/Versions/A/Foo に設定するだけです。動的リンカーはそれを /Applications/Bar.app/Contents/MacOS/../Frameworks/Foo.framework/Versions/A/Foo に展開し、そこでフレームワークを見つけます。

http://www.mikeash.com/pyblog/friday-qa-2009-11-06-linking-and-install-names.html

例を挙げて説明します。

次の実行可能ファイル/opt/local/bin/convertがあり、その dylib が/opt/local/libにあるとします。それを別のディレクトリにコピーし、実行可能ファイルをコピーしたのと同じディレクトリからその dylib をロードさせたいと考えています。

> mkdir ~/tmp/bin
> cp /opt/local/bin/convert ~/tmp/bin

実行可能ファイル dylibs のリストを取得します

> otool -L ~/tmp/bin/convert
~/tmp/bin/convert:
    /opt/local/lib/libtiff.3.dylib (compatibility version 13.0.0, current version 13.5.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
    /opt/local/lib/libjpeg.8.dylib (compatibility version 12.0.0, current version 12.0.0)
    /opt/local/lib/libfontconfig.1.dylib (compatibility version 6.0.0, current version 6.4.0)
    /opt/local/lib/libiconv.2.dylib (compatibility version 8.0.0, current version 8.1.0)
    /opt/local/lib/libfreetype.6.dylib (compatibility version 15.0.0, current version 15.0.0)
    /opt/local/lib/libexpat.1.dylib (compatibility version 7.0.0, current version 7.2.0)
    /opt/local/lib/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.6)
    /opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.6)
    ...

私は/opt/local/libディレクトリの dylib しか気にしないので、 /optのdylib だけを取り出します。特に/usr/lib/libSystemのものへの他のすべてのdylib参照をそのままにしておきたいです。

> DYLIBS=`otool -L ~/tmp/bin/convert | grep "/opt" | awk -F' ' '{ print $1 }'`

実行可能ファイルが参照するすべての dylib を、実行可能ファイルのコピー先と同じディレクトリにコピーします。

> for dylib in $DYLIBS; do cp $dylib ~/tmp/bin/; done;

を使用しinstall_name_toolて、上記の手順で取り出したすべての dylib のインストール名を変更し@executable_path、dylib 名の先頭に を付けて置き換えます。これにより、動的リンカーは、実行可能ファイルが配置されているディレクトリと同じディレクトリで dylib を検索します。

> for dylib in $DYLIBS; do install_name_tool -change $dylib @executable_path/`basename $dylib` ~/tmp/bin/convert; done;

インストール名が変更され、libSystem がまだ/usr/lib/libSystemを指していることを確認します。

> otool -L ~/tmp/bin/convert
~/tmp/bin/convert:
    @executable_path/libtiff.3.dylib (compatibility version 13.0.0, current version 13.5.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
    @executable_path/libjpeg.8.dylib (compatibility version 12.0.0, current version 12.0.0)
    @executable_path/libfontconfig.1.dylib (compatibility version 6.0.0, current version 6.4.0)
    @executable_path/libiconv.2.dylib (compatibility version 8.0.0, current version 8.1.0)
    @executable_path/libfreetype.6.dylib (compatibility version 15.0.0, current version 15.0.0)
    @executable_path/libexpat.1.dylib (compatibility version 7.0.0, current version 7.2.0)
    @executable_path/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.6)
    @executable_path/libz.1.dylib (compatibility version 1.0.0, current version 1.2.6)
    ...
于 2012-07-20T18:46:06.910 に答える
15

DYLD_LIBRARY_PATH環境変数を設定する必要があります。

dyldの man ページから:

      This  is  a  colon  separated  list  of directories that contain libraries. The dynamic linker
      searches these directories before it searches the default locations for libraries.  It  allows
      you to test new versions of existing libraries.

      For  each  library  that  a program uses, the dynamic linker looks for it in each directory in
      DYLD_LIBRARY_PATH in turn. If it still can't find the library,  it  then  searches  DYLD_FALL-
      BACK_FRAMEWORK_PATH and DYLD_FALLBACK_LIBRARY_PATH in turn.
于 2011-01-13T05:29:45.930 に答える
6

多くの方法。たぶんこれが役立ちます:

http://www.mikeash.com/pyblog/friday-qa-2009-11-06-linking-and-install-names.html

于 2011-01-13T05:30:30.247 に答える
2

dylib がライブラリの INSTALL_NAME で指定された場所にある場合、それは Just Work* になります。

それ以外の場合は、dylib の場所を DYLD_LIBRARY_PATH に追加できます。dyldのドキュメントを読むことをお勧めします。

*) 完全に正確に言うと、DYLD_ROOT_PATH/INSTALL_NAME にある必要がありますが、DYLD_ROOT_PATH に煩わされることはほとんどありません。

于 2011-01-13T05:29:33.497 に答える