-[rcssbase][rcssserver] boost::systemのチェック (akiyama) 15:38:18

久々にMacでコンパイルしてみたら,リンカが以下のエラーを吐いてしまった.

 (cd .libs && rm -f librcsslib.la && ln -s ../librcsslib.la librcsslib.la)
 /bin/sh ../../libtool --tag=CXX   --mode=link g++ -W -I./src -g -O2  -L/opt/local/lib -o rcsslibimporter libimporter.o -lboost_filesystem-mt  
 g++ -W -I./src -g -O2 -o rcsslibimporter libimporter.o -Wl,-bind_at_load  -L/opt/local/lib -lboost_filesystem-mt  
 Undefined symbols:
   "boost::system::get_posix_category()", referenced from:
       __static_initialization_and_destruction_0(int, int)in libimporter.o
       __static_initialization_and_destruction_0(int, int)in libimporter.o
   "boost::system::get_system_category()", referenced from:
       __static_initialization_and_destruction_0(int, int)in libimporter.o
       __static_initialization_and_destruction_0(int, int)in libimporter.o
 ld: symbol(s) not found
 collect2: ld returned 1 exit status
 make[4]: *** [rcsslibimporter] Error 1
 make[3]: *** [all-recursive] Error 1
 make[2]: *** [all-recursive] Error 1
 make[1]: *** [all-recursive] Error 1
 make: *** [all] Error 2

メッセージ内容から察するに,(少なくともMacPortsのboost-1.35.0では)boost::filesystemがboost::systemに依存しているんだろう.
[[ax_boost_system.m4:http://autoconf-archive.cryp.to/ax_boost_system.html]]を落としてきて,$(BOOST_SYSTEM_LIB)をリンクターゲットに追加したら,最後まで通った.

rcssserverにも同様の修正が必要.

解決できたのはいいが,boost::filesystemがboost::systemに依存しているのはいかがなものか.M4マクロで対応してしまうのがスマートだと思うが,自分で手を入れるとなると後々のメンテが大変なので,ax_boost_filesystem.m4が更新されるのを期待するか…

-[m4] ax_boost_filesystem修正 (akiyama) 16:16:11

どうも挙動がおかしいと思ったら,条件分岐の変数にlink_program_optionsなんてのが使われているのを見つけた.
どう見てもコピペによるミス.
これはさすがに直した方が良いので,修正.

ついでに,拡張子が*.dylibなライブラリを検出できるようにちょっとだけ手を入れた.

 $ svn diff ax_boost_filesystem.m4 
 Index: ax_boost_filesystem.m4
 ===================================================================
 --- ax_boost_filesystem.m4	(リビジョン 383)
 +++ ax_boost_filesystem.m4	(作業コピー)
 @@ -77,13 +77,13 @@
  			AC_DEFINE(HAVE_BOOST_FILESYSTEM,,[define if the Boost::Filesystem library is available])
              BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'`
              if test "x$ax_boost_user_filesystem_lib" = "x"; then
 -                for libextension in `ls $BOOSTLIBDIR/libboost_filesystem*.{so,a}* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_filesystem.*\)\.so.*$;\1;' -e 's;^lib\(boost_filesystem.*\)\.a*$;\1;'` ; do
 +                for libextension in `ls $BOOSTLIBDIR/libboost_filesystem*.{so,dylib,a}* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_filesystem.*\)\.so.*$;\1;' -e 's;^lib\(boost_filesystem.*\)\.dylib.*$;\1;' -e 's;^lib\(boost_filesystem.*\)\.a*$;\1;'` ; do
                       ax_lib=${libextension}
 				    AC_CHECK_LIB($ax_lib, exit,
                                  [BOOST_FILESYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_FILESYSTEM_LIB) link_filesystem="yes"; break],
                                  [link_filesystem="no"])
   				done
 -                if test "x$link_program_options" != "xyes"; then
 +                if test "x$link_filesystem" != "xyes"; then
                 for libextension in `ls $BOOSTLIBDIR/boost_filesystem*.{dll,a}* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^\(boost_filesystem.*\)\.dll.*$;\1;' -e 's;^\(boost_filesystem.*\)\.a*$;\1;'` ; do
                      ax_lib=${libextension}
 				    AC_CHECK_LIB($ax_lib, exit,


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SourceForge.JP
Creative Commons License
RoboCup tools by Hidehisa Akiyama is licensed under a Creative Commons 表示-非営利 2.1 日本 License.