• [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を落としてきて,$(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
Last-modified: 2016-03-14 (月) 14:51:38 (2049d)
SourceForge.JP
Creative Commons License
RoboCup tools by Hidehisa Akiyama is licensed under a Creative Commons 表示-非営利 2.1 日本 License.