いろいろはまる。
大元:
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
インストールできた!