LoginSignup
1
2

More than 5 years have passed since last update.

Mac OSX で共有ライブラリを-rpathを付けてリンクしたのに、実行時に共有ライブラリが見つからないエラーが出て格闘した。

Last updated at Posted at 2018-09-08

参考情報

実行ファイルのコンパイルオプションの問題ではない模様

症状

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つあるらしい。
  1. 共有ライブラリを修正する。リンカオプション-Wl,-install_name,@rpath/libbar.X.Y.dylib(もしくはフルパスで指定)をつけて構築しなおす。もしくは、構築後の共有ライブラリをinstall_name_tool -id "@rpath/libbar.X.Y.dylib" ${somewhere}/libbar.X.Y.dylibとして修正してしまう。(ただし、この方法を取れるかどうかは環境(ユーザー権限)によるであろう。)
  2. 実行ファイルを修正する。参考情報によると、install_name_tool -change "libbar.X.Y.dylib" "@rpath/libbar.X.Y.dylib" 実行ファイルでいけるらしい。(まだ試していない。)
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2