6

Xcode にプロジェクトがあり、環境変数ペインで DYLD_FALLBACK_LIBRARY_PATH を設定して、アプリケーションがリンク先のライブラリを探す場所を設定します (これは私の目的に適しています)。

ここに画像の説明を入力

現在、このプロジェクトを生成する CMakeLists.txt ファイルを作成しており、スクリプトからこのプロパティを設定したいと考えています。

私はこれができることを知っています:

SET(ENV{DYLD_FALLBACK_LIBRARY_PATH} ${DYLD_FALLBACK_LIBRARY_PATH} /path/to/lib)

しかし、実行すると次のエラーが発生します。

'dyld: Library not loaded ... Reason: image not found' 

アプリケーションを起動するとき。声明は同じではないと思います。

CMakeLists.txt から Xcode にあるものと同等のものをどのように達成できるか誰かが知っていますか?

私はCMake RPATHのことを漠然と認識していますが、可能であれば避けたいと思います。

お時間をいただきありがとうございます!

乾杯!

トム

4

1 に答える 1

11

私は最終的に、わずかに異なるアプローチを使用してこれを機能させました。これは完璧な解決策ではなく、すべての場合に機能するわけではありませんが、私と同様の問題を抱えている人に役立つことを願っています.

リンクしようとしていたdylibはlibSDL2-2.0.0

そのファイルがある場所に移動して実行すると、次のようになります。

otool -L libSDL2-2.0.0.dylib

出力の一番上の行は次のとおりです。

/usr/local/lib/libSDL2-2.0.0.dylib

次に、ビルドした実行可能ファイルに移動して同じコマンドを実行すると、同じことが表示されます。

/usr/local/lib/libSDL2-2.0.0.dylib

(私の実行ファイルは SDL にリンクされています)

私の問題はlibSDL2-2.0.0.dylib実際にはそこにあるのではなく、私のプロジェクト構造の libs フォルダーにあります。リンカが実行時にライブラリを見つけられるようにするには、dylib でこのコマンドを実行する必要がありました。

install_name_tool -id "@executable_path/../path/to/lib/<lib_name>" <lib_name>

実行するアプリケーションの場所はどこ@executable_pathですか - 私の場合、これは -build/debug

プロジェクト構造:

root/
    CMakeLists.txt
    project/
        lib/
            libSDL2-2.0.0.dylib
    build/
        debug/
            my_app

これは、わかりやすくするために正確なマッピングです。

install_name_tool -id "@executable_path/../../project/lib/libSDL2-2.0.0.dylib" libSDL2-2.0.0.dylib

実行すると、次のotool -L libSDL2-2.0.0.dylibように表示されます。

@executable_path/../../sdl-test/lib/libSDL2-2.0.0.dylib

出力の最初の行に。

プロジェクトを再度ビルドすると (Xcode でビルドしているだけです)、アプリが dylib への新しい相対パスで更新されます。ライブラリで実行するだけでよくinstall_name_tool、実行可能ファイルで実行する必要もありません。ビルドすると更新されます。

実行するotool -L myappと、同じ相対パスが表示されますlibSDL2-2.0.0.dylib

ということで、アプリを起動するとdylibを見つけることに成功!

DYLD_FALLBACK_LIBRARY_PATH私の理解では、これがOSXでこれを達成する方法であり、素晴らしい代替手段はありません(私の質問で言及したことをいじる以外に)

私と同じように困っている人の参考になれば幸いです!

役立つリソース:

http://osiris.laya.com/coding/dylib_linking.html

https://www.fmod.org/questions/question/forum-23398/

https://blogs.oracle.com/dipol/entry/dynamic_libraries_rpath_and_mac

アップデート:

rpaths を使用してこれを行うさらに良い方法を実際に見つけたので、今後の参考のためにこれを行う方法を書き留めようと思いました。

私の CMakeLists.txt ファイルでは、これらの行を最後に追加しました (ADD_EXECUTABLEとの後TARGET_LINK_LIBRARIES:

# set @rpaths for libraries to link against
SET(CMAKE_SKIP_BUILD_RPATH  FALSE)
SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) 
SET(CMAKE_INSTALL_RPATH "${PROJ_LIB_DIR}")
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

(詳細については、 https://cmake.org/Wiki/CMake_RPATH_handlingを参照してください)

${PROJ_LIB_DIR}私のdylibはどこにありますか:

SET(PROJ_LIB_DIR ${CMAKE_CURRENT_LIST_DIR}/lib)

次に実行しました:

例:

install_name_tool -id "@rpath/<my-dylib>.dylib" <my-dylib>.dylib

実際:

install_name_tool -id "@rpath/libSDL2-2.0.0.dylib" libSDL2-2.0.0.dylib

私のdylibがあるディレクトリ(私の場合はlibSDL2-2.0.0.dylib)

cmake を実行してプロジェクトをビルドすると、実行時に CMakeLists.txt ファイルに設定した場所で新しい実行可能ファイルがライブラリを検索します。@rpathCMakeLists.txt ファイルで指定されたパスに置き換えられ、@executable_pathまたはを明示的に設定しなくてもすべてが機能します。@loader_path

于 2016-08-01T23:27:36.667 に答える