2017-01-21 8 views
2

私のアプリにdylibを含めるには、XCodeの正しいオプションに苦労しています。私は/usr/local/libに私のアプリに必要なdylibを持っています。限り、私はLibの検索パスにこのパスを設定するよう分散型dylibのリンカー設定

enter image description here

すべてが正常に動作します。アプリでFrameworksフォルダに

enter image description here

これ確かにコピーdylib:しかし、もちろん、私はコピーフェーズにそれを追加した理由である私のアプリとdylibを配布したいです。しかし、ターゲットシステム上で実行されて、アプリはdylibを見つけることはありません。それは/usr/local/libでそれを見つけることさえできません。むしろそれはcroaks:

dyldのエラーメッセージ:

ライブラリがロードされていません:RPATH/libopencv_imgproc.3.2.dylib @

をので、設定する必要があるオプション?

私はサンプルプロジェクトhereをまとめました。 1つのプロジェクト、1つはヘッダが/usr/local/includeに配置され、もう1つはに配置されます。アプリをコンパイルすると、どこでも実行できるはずです。 dylibはアプリにコピーされますが、クリーンマシンで実行すると、まだのdylibが検索されます。

私は、これを動作させるために(あまりにも)多くの方法を試したので、現在完全に混同されています。

+0

ビルドフェーズで 'Link Binary With Libraries'の下に' dylib'が含まれていますか? 'dylib'のコピーを作成し、' Frameworks'フォルダのプロジェクトに追加することもお勧めします。そうすれば、プロジェクトをビルドするときに正しく設定されます。 –

+0

@ l'L'lはい、確かに。それ以外の場合、コンパイルはすでに失敗します。プロジェクトへのコピーは違いはありません。 dylibは、上記のコピーフェーズで実行されるアプリ内にある必要があります。 –

+0

ビルド設定>リンク>ランパス検索パスに '@ executable_path/Frameworks'を追加してみてください。 –

答えて

1

前述のように、エラーメッセージのdylibの名前は、実際に使用しているもの(3.23.2.0)と異なります。 dylibはすでにビルドされており、この方法でプロジェクトにインジケータを含めるので、既存のrpathまたはidがすでに存在します。 otoolを使用して

$ otool -l libopencv_core.3.2.0.dylib 
... 
Load command 3 
      cmd LC_ID_DYLIB 
     cmdsize 56 
     name @rpath/libopencv_core.3.2.dylib (offset 24) 
    time stamp 1 Wed Dec 31 17:00:01 1969 
     current version 3.2.0 
compatibility version 3.2.0 
... 
Load command 16 
      cmd LC_RPATH 
     cmdsize 32 
     path /usr/local/lib (offset 12) 

二つのものがここで観察することができます。最初は矛盾を確認するLC_ID_DYLIBであり、第2に、存在するLC_RPATH(rpath)は、ライブラリの場所が/usr/local/libであることを示すように設定されている。あなたのアプリでlibをインクルードするので、更新する必要があります。

アップデートライブラリ(1アプリに含まれている):

$ install_name_tool -id @rpath/libopencv_core.3.2.0.dylib libopencv_core.3.2.0.dylib 

アップデートLC_ID_DYLIB

$ install_name_tool -add_rpath "@executable/../Frameworks" libopencv_core.3.2.0.dylib 

正しいLC_RPATHを追加します。

$ install_name_tool -delete_rpath "/usr/local/lib" libopencv_core.3.2.0.dylib 

は、ライブラリからrpath/usr/local/libを削除します。再び実行otool -l確認するには:

... 
Load command 3 
      cmd LC_ID_DYLIB 
     cmdsize 64 
     name @rpath/libopencv_core.3.2.0.dylib (offset 24) 
    time stamp 1 Wed Dec 31 17:00:01 1969 
     current version 3.2.0 
compatibility version 3.2.0 
... 
Load command 17 
      cmd LC_RPATH 
     cmdsize 40 
     path @executable/../Frameworks (offset 12) 

を今、あなたは、スタンドアロンのアプリでdylibを含めることができる必要があり、それはパスだ正しく設定する必要があります。更新されたdylibhereです。ライブラリを更新すると、アプリは問題なく開かれます。

ノート:あなたの質問には、あなたは、エラー状態libopencv_imgproc.3.2.dylibものの、libopencv_core3.2.0.dylibをインポートしているが、私はそれが同様の問題を受け、別のdylibをだと仮定し、これは確かに他の人にも適用することができます。ライブラリは、複数のrpathsが存在することが可能と/usr/local/bin以来、すでにそれは、最初にその場所を使用して、間違った名前に加えています存在するがrpathあなたが最初にXcodeで設定していたが

enter image description here

正しかったです。

+1

素晴らしいこれらの内部構造は認識していませんでしたが、今どこから問題が発生しているのか分かります。他のライブラリも同様の調整が必要です。お時間をいただきありがとうございます。 –

+0

トーマス(予期せぬ)賞金をいただきありがとうございます。それは本当に私の一日を盛り上げました! :) –

+0

あなたは私の一日を作りました:-) –

関連する問題