参考情報
実行ファイルのコンパイルオプションの問題ではない模様
症状
clang++ -o foo foo.cc -Wl,-L,${somewhere} -Wl,-rpath,${somewhere} -lbar
とコンパイル、リンクしたのにもかかわらず、foo
を実行すると、dyld: Library not loaded: libbar.X.Y.dylib
といったエラーがでる。もちろん、${somewhere}/
以下にlibbar.X.Y.dylib
は存在する。環境変数DYLD_FALLBACK_LIBRARY_PATH
を設定すれば実行することは可能であるが、それではもともと-rpath
をつけてリンクしたかった意図は実現できていない。
調査
otool -L foo
として該当する共有ライブラリの項目をみると、libbar.X.Y.dylib
とだけ表示されてる。一方、-rpath
でリンクして実行時に思い通りに見つけられている共有ライブラリの場合、@rpath/libaaa.X.Y.dylib
もしくはフルパスで表示される。
対処
- 参考情報によると、共有ライブラリのコンパイル時に適切に"install_name"が適切に設定されていないと、実行ファイルのコンパイル時に
-rpath
オプションを付けても実行時共有ライブラリ検索パス設定が働かない、ということらしい。対処法としては、2つあるらしい。
- 共有ライブラリを修正する。リンカオプション
-Wl,-install_name,@rpath/libbar.X.Y.dylib
(もしくはフルパスで指定)をつけて構築しなおす。もしくは、構築後の共有ライブラリをinstall_name_tool -id "@rpath/libbar.X.Y.dylib" ${somewhere}/libbar.X.Y.dylib
として修正してしまう。(ただし、この方法を取れるかどうかは環境(ユーザー権限)によるであろう。) - 実行ファイルを修正する。参考情報によると、
install_name_tool -change "libbar.X.Y.dylib" "@rpath/libbar.X.Y.dylib" 実行ファイル
でいけるらしい。(まだ試していない。)