3

XCodeでdylibを作成しました。インストール ディレクトリを @rpath に設定しました。次に、この dylib を使用するテスト プロジェクトを作成しました。実行すると、dyld エラーが発生します: ライブラリがロードされていません....理由: 画像が見つかりません。

しかし....そのdylibを/ usr/libフォルダーに入れると、魅力的に機能します。

私の質問は、この dylib をコンパイルするときに、いくつかの設定を指定して、/usr/lib を検索せず、単純にその場所を検索する方法はありますか (意味がある場合) ですか? ありがとう!

4

1 に答える 1

6

編集:この回答を書いた後、あなたの質問を読み直しました。実行可能ファイルではなく dylib のみを作成しているため、install_name_tool -idコマンドを使用するだけで済みます。どこにいても自分自身を探すように指示できるとは思えません。パスを与える必要があると思います。この例では、アプリケーション バンドルのFrameworksパスを検索します。これは、非常に妥当な場所です。


アプリケーションがファイルを検索するパスと、ライブラリが自分自身を見つけると予想されるパスの両方を変更する必要があります。これは、3 つの OpenCV ライブラリを使用している例です。

これらの最初の行は、アプリケーション バンドルのFrameworksフォルダーでライブラリを探すようにアプリケーションに指示します。($BUILT_PRODUCTS_DIR/$EXECUTABLE_PATHは、実行可能ファイルを指定する環境変数の組み合わせです。)

#Fix references in executable
install_name_tool -change lib/libopencv_core.2.3.dylib @executable_path/../Frameworks/libopencv_core.2.3.1.dylib $BUILT_PRODUCTS_DIR/$EXECUTABLE_PATH 
install_name_tool -change lib/libopencv_imgproc.2.3.dylib @executable_path/../Frameworks/libopencv_imgproc.2.3.1.dylib $BUILT_PRODUCTS_DIR/$EXECUTABLE_PATH 
install_name_tool -change lib/libopencv_highgui.2.3.dylib @executable_path/../Frameworks/libopencv_highgui.2.3.1.dylib $BUILT_PRODUCTS_DIR/$EXECUTABLE_PATH

lib/libopencv_core.2.3.dylib以前に を実行して、最初のパラメーター ( ) を取得しましたotool -L

$ otool -L libopencv_imgproc.2.3.1.dylib 
libopencv_imgproc.2.3.1.dylib:
    lib/libopencv_imgproc.2.3.dylib (compatibility version 2.3.0, current version 2.3.1)
    lib/libopencv_core.2.3.dylib (compatibility version 2.3.0, current version 2.3.1)
    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.3)
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)

これらの次の行は、ライブラリにFrameworksフォルダーで自分自身を探すように指示します。

#Fix install location in libraries
install_name_tool -id @executable_path/../Frameworks/libopencv_core.2.3.1.dylib $BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH/libopencv_core.2.3.1.dylib
install_name_tool -id @executable_path/../Frameworks/libopencv_imgproc.2.3.1.dylib $BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH/libopencv_imgproc.2.3.1.dylib
install_name_tool -id @executable_path/../Frameworks/libopencv_highgui.2.3.1.dylib $BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH/libopencv_highgui.2.3.1.dylib

これらの行は、ライブラリがFrameworksフォルダー内で相互に検索するように指示します。

#Fix references in libraries
install_name_tool -change lib/libopencv_core.2.3.dylib @executable_path/../Frameworks/libopencv_core.2.3.1.dylib $BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH/libopencv_imgproc.2.3.1.dylib
install_name_tool -change lib/libopencv_core.2.3.dylib @executable_path/../Frameworks/libopencv_core.2.3.1.dylib $BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH/libopencv_highgui.2.3.1.dylib 
install_name_tool -change lib/libopencv_imgproc.2.3.dylib @executable_path/../Frameworks/libopencv_imgproc.2.3.1.dylib $BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH/libopencv_highgui.2.3.1.dylib

これはすべて、Xcode プロジェクトのターゲットの Run Script ビルド フェーズからのものです。

于 2011-08-24T04:57:51.290 に答える