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 以前と gcc 4.3 の違いに起因するようです。
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
ふらいんぐ・ふぉ〜とれす きんきょ

makeやbuildで"error: too many initializers for ‘swig_command_info’"を吐き出されて困っている人はエラー出たファイルの"typedef XS(SwigPerlWrapper);"って部分を"typedef XSPROTO(SwigPerlWrapper);"に変えてみればいいと思うよ!

というわけで 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―┛~~フゥ〜

- スポンサーリンク -