[choreonoid-users-ja 00042] Mac OS X で Boost 1.50.0 を用いたビルドのエラーについて

Shin'ichiro Nakaoka s.nakaoka @ aist.go.jp
2012年 7月 30日 (月) 20:31:01 JST


中岡です。

菅さんから、コレオノイド1.3.0でもMac OS XでBoost 1.50.0 を用いるとビルド
に失敗するという報告をいただき、調査しました。(菅さん報告ありがとうござ
います。)

まず、本症状をこちらでも確認できました。こちらのチェックが不十分であった
ことをお詫びします。

エラーとしては以下のようなリンクエラーがずらずらと出てしまいます。

Undefined symbols for architecture x86_64:
  "boost::filesystem3::path::begin() const", referenced from:
      cnoid::makePathCompact(boost::filesystem3::path&,
boost::filesystem3::path&)in FileUtil.cpp.o

コンパイルは通っていて、リンク時に filesystem のライブラリもリンクしてい
るので、不可解なエラーではあります。Ubuntu と Windows ではこのようなエ
ラーは出ていません。

そこで、よく分からなかったのですが、CMakeの生成するリンクコマンドで、
boost関係のリンクが

/usr/bin/c++  -O3 -DNDEBUG   -dynamiclib ...
/Users/nakaoka/usr/boost-1.50.0/lib/libboost_filesystem.dylib

といったように、ライブラリファイルをフルパスで指定する形式になっていまし
た。特に当てがあったわけではないのですが、なんとなくこれを
-lboost_filesystem という通常のリンク指定に変えたところ、なぜかリンクが
通りました。

こちらで使っている他のBoostのバージョンでも、フルパス指定になりますが、
そちらはエラーも出ず、無事ビルドできます。

というわけで今のところ分かったことは、

・Boost 1.50.0 では filesystem ライブラリをフルパスで指定するとリンクエ
ラーになるが、 -l 形式で指定すればOK. Boostの他のバージョンやfilesystem
以外のライブラリについては、フルパス形式でも大丈夫

というものです。しかし、フルパス形式の指定も間違った指定というわけでもな
さそうなので、非常に不可解なエラーに思えます。

フルパス形式になっているのは、CMake標準添付のFindBoost.cmake というスク
リプトがそうするようになっているようです。ですので、FindBoostの使用を止
めて、直接リンクコマンドを記述するようにすれば、ビルドを通せそうです。で
もそれもいろいろと大変そうです。

というわけなので、当面Mac OS Xでは Boost 1.50.0 は非対応ということにいた
し、ドキュメントにも明記しておくことにします。

以上よろしくお願い致します。

-- 
Shin'ichiro Nakaoka <s.nakaoka @ aist.go.jp>


choreonoid-users-ja メーリングリストの案内