2011-12-28 18 views
1

私のXCode 4.2プロジェクトを動的ライブラリ(dynlib)に対して実行するのに問題があります。dyld:ライブラリがロードされていません:../lib/abc.dynlib

私がやっていることは、xcodeプロジェクトにライブラリを追加し、このlibで新しい 'Copy Files'ビルドフェーズを作成することです。

私はビルドフェーズでDestinationを 'Products Directory'に設定するとプロジェクトはうまく動作しますが、その中に埋め込まれたアプリケーションと一緒にlibを配布する必要があります。

ビルドフェーズの[デスティネーション]の他のすべての設定で、タイトルにエラーが表示されます。

また、私はxcodeを終了し、ビルドディレクトリを削除して、クリーンで、そのようなすべてのトリックを試みました。

プロジェクト/ターゲット設定がありますか? なぜXCodeは '../lib/'のdynlibを探していますか? (エラーで示されているように)

答えて

3

2つのオプションがあります:a)ライブラリIDを変更し、b)最終製品を変更します。

IDはdylibに埋め込まれ、dyldがどこを探すのかを定義します。 IDは、リンク時にライブラリから取得されます(他の特別なフラグが使用されていない場合)。あなたは、例えば、otool -Lでそれを確認することができます。:

gammu:~$ otool -L /usr/lib/libz.dylib 
/usr/lib/libz.dylib: 
    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0) 

最初の行はdylibのIDです。 install_name_tool -id <path> <library>を使用して変更できます。 1つのオプションは、バイナリの場所から始まる特別なフォーム@executable_path/...を使用することです(他のものもあります)。

2番目のオプション(同じことを達成する)は、製品内のライブラリへのパスを変更することです。あなたはそれが同じotool -Lコマンドでライブラリをリンクする方法を確認することができます。

gammu:~$ otool -L /usr/bin/emacs 
/usr/bin/emacs: 
    /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0) 

あなたはその後、例えば、install_name_tool -change <old> <new> <target>でライブラリを変更することができます。

install_name_tool -change ../lib/abc.dynlib @executable_path/../lib/abc.dylib foo 

最後に、Xcodeのは、通常、自動的にこのすべてをないことに注意してください(手動でコピーするのではなく)dylibを管理できるようにした場合。

+0

私はdynlibを作成していないので、Xcodeに統合することはできません。しかし、2番目の作品です。ありがとう! – yzucker

2

私は同じ問題があり、最初の解決策を試してみました。最初のオプションは機能しません。第二の選択肢だけでは問題を解決することはできません。

dylibのXcodeビルド設定で、 "Dynamic Library Install Name"を "<newpath>/<your.dylib>"に設定します。 Newpathはあなたのオブジェクトファイルfooが見ることができるパスで、あなたのdylibを保持するのと同じパスです。 dylibをビルドしてオブジェクトファイルをビルドした後、これらのパスは自動的にオブジェクトファイルに入れられます。

目的ファイルとdylibの両方についてotool -Lで確認できます。

0

私は同じ問題を抱えていたし、この方法で解決:

が不足しているファイルの検索:

mdfind libz.1.dylib 

をそれがここにあった:/Applications/Vagrant/embedded/lib/libz.1。dylib

は、スーパーユーザー権限でフォルダを行方不明にそれをコピーします。

sudo sudo cp /Applications/Vagrant/embedded/lib/libz.1.dylib /usr/lib/libz.1.dylib 

は完了、すべてがいつものように動作します。

関連する問題