gcc 4.3 で yamcha と cabocha でインストールエラーが発生する件
テキストマイニング系が好きです。
従って yamcha とか cabocha のインストールは必須です。そう言えば最近は Yahoo! の API でも係り受けをさせることができるようになってますが、やっぱり cabocha をインストールして local でガシガシ使いたいです。
ってわけで yamcha & cabocha をインストールするもコンパイルエラー。うーん・・・fedora 10 での環境構築。なかなかハードル高いです。
cd /usr/local/src/chasen/ wget http://chasen.org/~taku/software/YamCha/src/yamcha-0.33.tar.gz tar xvfz yamcha-0.33.tar.gz cd yamcha-0.33 ./configure make check make install
ってないつもの感じで、普通にコンパイルしてみたら、こんなエラーが・・・
make[1]: ディレクトリ `/usr/local/src/chasen/yamcha-0.33/src' に入ります /bin/sh ../libtool --mode=compile --tag=CXX g++ -DHAVE_CONFIG_H -I. -I. -I.. -O3 -Wno-deprecated -Wall -c -o param.lo param.cpp g++ -DHAVE_CONFIG_H -I. -I. -I.. -O3 -Wno-deprecated -Wall -c param.cpp -fPIC -DPIC -o .libs/param.o param.cpp: In member function 'bool YamCha::Param::open(int, char**, const YamCha::Option*)': param.cpp:102: error: 'strlen' was not declared in this scope param.cpp:103: error: 'strncmp' was not declared in this scope param.cpp: In member function 'bool YamCha::Param::open(const char*, const YamCha::Option*)': param.cpp:182: error: 'strncpy' was not declared in this scope param.cpp:185: warning: deprecated conversion from string constant to 'char*' param.cpp: In member function 'void YamCha::Param::help(std::ostream&, const YamCha::Option*)': param.cpp:205: error: 'strlen' was not declared in this scope param.cpp:211: error: 'strlen' was not declared in this scope make[1]: *** [param.lo] エラー 1 make[1]: ディレクトリ `/usr/local/src/chasen/yamcha-0.33/src' から出ます make: *** [check-recursive] エラー 1
ちょっとぐぐってみたら情報ありました! ヽ(`Д´)/ビンゴ!
cabocha-0.53 が fedora 9 (gcc 4.3) で make できない、そんなとき | sugiyama-log
gcc 4.2 以前では、string.h や stdlib.h のようなヘッダファイルは明示的にインクルードしていなくても、そのヘッダファイルでプロトタイプ宣言されている関数を呼び出すことができました。
gcc 4.3 では明示的なインクルードが必要です。
とりあえず、 src/common.h に #include <string.h> を追加して make してみます
ってわけで src/common.h に以下を追加
#include <string.h>
再度 make をしてみるも、まだエラー発生!
if g++ -DHAVE_CONFIG_H -I. -I. -I.. -I../src -O3 -Wno-deprecated -Wall -MT mkdarts.o -MD -MP -MF ".deps/mkdarts.Tpo" -c -o mkdarts.o mkdarts.cpp; \ then mv -f ".deps/mkdarts.Tpo" ".deps/mkdarts.Po"; else rm -f ".deps/mkdarts.Tpo"; exit 1; fi mkdarts.cpp: In function 'int main(int, char**)': mkdarts.cpp:83: error: 'atoi' is not a member of 'std' make[2]: *** [mkdarts.o] エラー 1
さらに ./libexec/mkdarts.cpp にも手を加える。
#include <cstdlib>
上記2つの対策で yamcha は無事にコンパイルすることができました! (*`Д´)ノヨッシャ!!
さて、次は cabocha だ!
cd /usr/local/src/chasen/ wget http://chasen.org/~taku/software/CaboCha/src/cabocha-0.53.tar.gz tar xvfz cabocha-0.53.tar.gz cd cabocha-0.53 ./configure --enable-mecab-static ## yamcha と同じく src/common.h に #include <string.h> を追加 make make check make install
cabocha のインストール成功! 次に Perl バインディングをインストール。
cd perl perl Makefile.PL make
調子があがってきたところで、ここでも激しくつまずきます。次はこんなエラーが・・・
g++ -c -I/usr/local/include -D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm -O2 -DVERSION=\"undef\" -DXS_VERSION=\"undef\" -fPIC "-I/usr/local/lib/perl5/5.8.9/x86_64-linux-thread-multi/CORE" CaboCha_wrap.cxx /usr/lib/gcc/x86_64-redhat-linux/4.3.2/../../../../include/c++/4.3.2/backward/strstream:51 から include されたファイル中, /usr/local/include/cabocha.h:110 から, CaboCha_wrap.cxx:1058 から: /usr/lib/gcc/x86_64-redhat-linux/4.3.2/../../../../include/c++/4.3.2/backward/backward_warning.h:33:2: 警告: #warning This file includes at least one deprecated or antiquated header which may be removed without further notice at a future date. Please use a non-deprecated interface with equivalent functionality instead. For a listing of replacement headers and interfaces, consult the file backward_warning.h. To disable this warning use -Wno-deprecated. CaboCha_wrap.cxx:850: error: expected unqualified-id before string constant CaboCha_wrap.cxx:851: error: expected initializer before '*' token CaboCha_wrap.cxx:856: error: 'SwigPerlWrapperPtr' does not name a type CaboCha_wrap.cxx:2420: error: too many initializers for 'swig_command_info' CaboCha_wrap.cxx:2420: error: too many initializers for 'swig_command_info' ... CaboCha_wrap.cxx:2420: error: too many initializers for 'swig_command_info' CaboCha_wrap.cxx: In function 'void boot_CaboCha(PerlInterpreter*, CV*)': CaboCha_wrap.cxx:2584: error: 'struct swig_command_info' has no member named 'wrapper' make: *** [CaboCha_wrap.o] エラー 1
またまたぐぐってみたら情報見つかりました。ラッキーです。
typedef XS(foo) - fails in C++ /w 5.10.0 - nntp.perl.org
ふらいんぐ・ふぉ〜とれす きんきょ
というわけで perl/CaboCha_wrap.cxx を以下のように修正します。赤色の文字の部分です。
/* Macros for low-level exception handling */ #define SWIG_fail goto fail #define SWIG_croak(x) { SWIG_SetError(x); goto fail; } #define SWIG_croakSV(x) { SWIG_SetErrorSV(x); goto fail; } /* most preprocessors do not support vararg macros :-( */ /* #define SWIG_croakf(x...) { SWIG_SetErrorf(x); goto fail; } */ //typedef XS(SwigPerlWrapper); typedef XSPROTO(SwigPerlWrapper); // ここを書き換える typedef SwigPerlWrapper *SwigPerlWrapperPtr; /* Structure for command table */ typedef struct { const char *name; SwigPerlWrapperPtr wrapper; } swig_command_info;
これで無事に make intall まで正常終了させることができました。 ( ´ー`)y―┛~~フゥ〜
コメントやシェアをお願いします!