cygwinに日本語係り受け解析器CaboChaをインストール

いろいろはまる。
大元:
http://taku910.github.io/cabocha/ 



事前に必要なもの
CRF++
MeCab 0.98

MeCabは0.98インストール済みとして, 0.99系はうまくcygwinにインストールできず)

  • CRF++のインストール

(1)まずはソースの取得
google-codeがおかしくなっているので、
以下のgoogle driveから最新版(今はCRF++-0.58.tar.gz)をダウンロード
https://drive.google.com/folderview?id=0B4y35FiV1wh7fngteFhHQUN2Y1B5eUJBNHZUemJYQV9VWlBUb3JlX0xBdWVZTWtSbVBneU0&usp=drive_web


(2)CRF++-0.58のインストール
まず、解凍&移動

gzip -d CRF++-0.58.tar.gz
tar -xvf CRF++-0.58.tar
cd CRF++-0.58

普通に

./configure
make
make install

とすると
エラーコード

/usr/src/debug/cygwin-1.7.35-1/winsup/cygwin/lib/libcmain.c:39: undefined reference to `WinMain'
/usr/src/debug/cygwin-1.7.35-1/winsup/cygwin/lib/libcmain.c:39:(.text.startup+0x7e): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `WinMain'
collect2: error: ld returned 1 exit status
Makefile:410: recipe for target 'crf_learn.exe' failed
make[1]: *** [crf_learn.exe] Error 1
make: *** [all] Error 2

`WinMain'がないのは、main関数がないということ。cygwinではmain関数がないのに`WinMain'関数がないと
エラーをだす。
http://ist.ksc.kwansei.ac.jp/~tutimura/debug/?Cygwin%E3%81%A7%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%2F%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AE%E5%87%BA%E3%82%8B%E5%A0%B4%E5%90%88
を参考に.


原因は、mainをwinmain.h内の以下のコードで上書きしてしまっていることにある。
具体的には以下の部分

#define main(argc, argv) wmain_to_main_wrapper(argc, argv)

int wmain_to_main_wrapper(int argc, char **argv);

int wmain(int argc, wchar_t **argv) {
  CommandLine cmd(argc, argv);
  return wmain_to_main_wrapper(cmd.argc(), cmd.argv());
}
#endif

が原因.
crf_learn.cppで

#include "crfpp.h"
#include "winmain.h"

int main(int argc, char **argv) {
  return crfpp_learn(argc, argv);
}

のmainが上書きされてしまう。

そこで、思い切って問題部分をコメントアウトしてしまう

55
 56   int argc_;
 57   char **argv_;
 58 };
 59 }  // namespace
 60 /*
 61 #define main(argc, argv) wmain_to_main_wrapper(argc, argv)
 62
 63 int wmain_to_main_wrapper(int argc, char **argv);
 64
 65 int wmain(int argc, wchar_t **argv) {
 66   CommandLine cmd(argc, argv);
 67   return wmain_to_main_wrapper(cmd.argc(), cmd.argv());
 68 }
 69 */
 70 #endif

こうしてから

make clean
make
make install

でインストールできた!


http://cat-in-136.github.io/2012/04/unicodemingw32twinmainwwinmain.html
https://searchcode.com/codesearch/view/11362989/ 
winmain.h

つぎに、cabocha本体のインストール

  • cabocha本体のインストール

https://drive.google.com/folderview?id=0B4y35FiV1wh7cGRCUUJHVTNJRnM&usp=sharing#list
から最新版をもってくる

  • >mecabのバージョンがあわなくてうまくいかない.

そこで旧版であるmecab-0.60を導入
(1)上記のリンクからcabocha-0.60をもってくる
(2)解凍

gzip -d cabocha-0.60.tar.gz
tar -xvf cabocha-0.60.gar
cd cabocha-0.60
./configure
make

こける.
エラーメッセージ

utils.cpp: In function 'void CaboCha::Unlink(const char*)':
utils.cpp:238:3: error: '::unlink' has not been declared
::unlink(filename);
^
Makefile:466: recipe for target 'utils.lo' failed

unlinkがないというので、とりあえず、removeにしてみたらコンパイルは通った.
内部的にはremoveはunlinkを読んでいるらしいが,
実質的には,rmdirコマンドをシステムコールしているらしい.
http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/remove.3.html

以下ようにsrc/utils.cを修正
修正前:

void Unlink(const char *filename) {
#if defined(_WIN32) && !defined(__CYGWIN__)
  ::DeleteFileA(filename);
#else
  ::unlink(filename);
#endif
}

修正後

void Unlink(const char *filename) {
#if defined(_WIN32) && !defined(__CYGWIN__)
  ::DeleteFileA(filename);
#else
  //::unlink(filename);
 ::remove(filename);
#endif
}

以下

make clean
make
make install

インストールできた!