2011-01-13 12 views
31

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

+4

'otool -L app'を使用してアプリケーションの依存関係を確認してください。それらが絶対パスとしてハードコードされている場合は、 'install_name_tool -change old new file'を使って相対パスに変更します。その後、リンカは 'DYLD_LIBRARY_PATH'環境変数でライブラリを見つけることができます。 – aponomarenko

答えて

2

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

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

*)は完全に正確である必要がありますが、DYLD_ROOT_PATH/INSTALL_NAMEにある必要がありますが、DYLD_ROOT_PATHを使用するのは非常にまれです。

+0

申し訳ありませんが、「ライブラリのINSTALL_NAME」とは何ですか?私はDYLD_LIBRARY_PATHを追加しても動作しません。混乱します。 –

+0

変数をエクスポートする必要があります:export DYLD_LIBRARY_PATH =/usr/local/lib' – Michel

13

DYLD_LIBRARY_PATH環境変数を設定する必要があります。 dyld man pageから

 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. 
+0

ありがとう!私もgoogleでこれを見つけた、私はDYLD_LIBRARY_PATHを設定した、しかし、それは動作しません、問題はまだそこにある!私はとても混乱しています –

+0

私はそれを試したところ、私のMacでうまく動作します。 – EmeryBerger

+0

こんにちは、EmeryBerger、あなたは元々空のDYLD_LIBRARY_PATH変数ですか?私のです。これが最初に間違っているかどうかはわかりません。 –

34

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

@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/Versionions/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

私は例を挙げて紹介します。

はのはとそのdylibsがのlib /ローカルは/ opt /にある変換/ Iは、次の実行可能は/ opt/local/binにあるとしましょう。 別のディレクトリにコピーして、実行可能ファイルをコピーした場所と同じディレクトリからdylibをロードします。

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

取得の実行可能ファイルのリストが

> 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のディレクトリ内dylibs気に、私たちはでのみdylibsを引き出し/を選ぶdylibs 。私は他のすべてのdylib参照をそのまま/usr/lib/libSystemものに保ちたいと思います。

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

は、実行ファイルがにコピーされた同じディレクトリに実行ファイルが参照するすべてのdylibsをコピーします。

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

我々は、上記の手順で引き出さすべてdylibsのインストール名前を変更し、dylib名に@executable_pathを付加することで、それらを交換するinstall_name_toolを使用してください。これにより、ダイナミックリンカは、実行可能ファイルのあるディレクトリと同じディレクトリにある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) 
    ... 
+0

絶対パスへのリンクを含んでいる可能性があるので、各ライブラリファイルについても同様に行う必要があることに注意してください – Claudiu

関連する問題