MacでBoostの共有ライブラリを使おうとしたらdyldでエラーが出た
環境
現在、研究の実装はC++で書いてるんですが、その際にBoostを利用してます。 普段は計算用サーバー(CentOS)上で実行しています。 今、開発環境をeclipse+CDTにしようとしていて、テストのためにローカルのMacでも研究の実装を動かしたいという状況です。
eclipse+CDTでビルドは出来たと。(ここも苦労したけど) で、早速実行してみると、
$ cd my_workspace
$ ./my_program
dyld: Library not loaded: libboost_system.dylib
Referenced from: path_to_boost/libboost_filesystem.dylib
Reason: image not found
*my_workspaceはmy_programが置いてあるところ、my_program は私が研究の実装をビルドした実行ファイル、path_to_boostは私のboostのインストール先です(例えば、/opt/local/libとか)。いや、コレ勘違いしてpath_to_boostというものが実際にあると思ってる人もいるよ。実際見たことあるし。
とかなった。
このエラー自体はめっちゃいっぱい情報出てきて、要するに、リンカ(dyld)が「libboost_system.dylibを見つけらんないよ〜」と言ってるんだけど、私はeclipseの設定でリンク時に、
$ g++ -L"path_to_boost" -Xlinker -rpath -Xlinker path_to_boost -o my_program XXX.o YYY.o ZZZ.o -lboost_system ...
としてrpathを指定しているのに、あのエラーが出る。 実行ファイル(my_programのことね)と共有ライブラリ(ダイナミックリンクライブラリ)がうまくリンクされてないのかどうかをotoolでチェックする。
$ otool -L my_program
my_program:
libboost_system.dylib (compatibility version 0.0.0, current version 0.0.0)
...
/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)
ダメっぽい。
この後色々やったけど、ココを見て解決。共有ライブラリは諦めて、スタティックライブラリを使う。この記事によると、MacでBoostの共有ライブラリを使うのは面倒らしい。また、rpathの指定も無駄だったのかな…?
path_to_boostの中から共有ライブラリを削除し、スタティックライブラリだけにしておく。
$ cd path_to_boost
$ ls
...
libboost_system.a
libboost_system.dylib
...
$ mkdir dylib_removed
$ mv libboost_system.dylib dylib_removed
$ ls
...
libboost_system.a
...
スタティックライブラリのほうだけ残しておく。
これでビルドしたら実行ファイルは、
otool -L my_program
my_program:
/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)
boostの共有ライブラリへのリンクが消えてる。つまり実行ファイル(my_program)内に一緒に入ってる(スタティックリンク)。 こうすると、最初のエラーは消えて、ちゃんと実行できた。こんなんでいいのか。
$ cd my_workspace
$ ./my_program
あーなんか上手く書けない。
あとこういうの困る人いないの?この解決策ってなんかダメところあるのか。
誰か教えて〜。