怒りのプログラミング

こんなポンコツがプログラマとして生活していることに驚きを禁じえません。 *ご指摘等あればお気軽にコメントください

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

あーなんか上手く書けない。

あとこういうの困る人いないの?この解決策ってなんかダメところあるのか。

誰か教えて〜。