閉じる

boost 1.45.0

./bootstrap.sh
./bjam –layout=versioned –without-mpi –without-python link=static runtime-link=static release debug install
リンク時に「multiple definition of `boost::archive::detail::extra_detail::init_guid<XXX>::g’」ってなエラーが多量に出るな。
XXXからすると serialization関連だと思われ。
.cppに書かなければいけないのを .hに書いてるのかしら?
どうも、BOOST_CLASS_EXPORTを .hに書いた場合に inlucde毎に何かが実体化されているようね。
お呪いで書いただけなので削除してまわる。
必要で書いていたのなら .cppにまとめればいいのかなぁ?
2010/12/3 追記
記事を起こした時点では全く情報がなかったけど、起こした後はこのページが検索に引っかかる様になったな。
うちの環境だけではないようね。
2010/12/4 追記
1.44から 1.45に変えた時点で発生しているのでソースの差分を見てみると 1.44では BOOST_CLASS_EXPORTの実体が boost::archive::detail下の空のネームスペース内に定義されているのに対し 1.45ではboost::archive::detail::extra_detail下に直接定義されている事がわかる。
空のネームスペース*1 って何に使うのかと思ったら「ファイル固有の」という意味合いになるらしいね。
staticと似たような感じ?
結果として、1.44ではコンパイル単位で閉じていたのが 1.45では閉じなくなって、件のエラーになっていた模様。
修正パッチ : export.hpp.diff
少なくともこの修正でリンクが通るようになり、基底クラスへのポインタを通じた派生クラスのシリアライズ&デシリアライズも動いている。
スペースの入れ方のように「意味的には一緒だけど、書き手のスタイルに依存する」修正がチョロチョロ入っているので「無名のネームスペース?命名しちゃる」ってノリなのかもしれない。
.cppにまとめるのが boostの流儀なら元々エラーにもならないし。


*1 namespace {hogehoge}という表記。

boost 1.45.0」への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。必須項目には印がついています *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)