私は最終的に、わずかに異なるアプローチを使用してこれを機能させました。これは完璧な解決策ではなく、すべての場合に機能するわけではありませんが、私と同様の問題を抱えている人に役立つことを願っています.
リンクしようとしていた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 ファイルに設定した場所で新しい実行可能ファイルがライブラリを検索します。@rpath
CMakeLists.txt ファイルで指定されたパスに置き換えられ、@executable_path
またはを明示的に設定しなくてもすべてが機能します。@loader_path