OSXでHaskellとMeCab
ハマったのでメモ。(割りとどうでも良い落ちだったのでアレ)
困った
環境: OSX10.9.4 + GHC7.8.2 + MeCab0.996(HomeBrewでインストール) + cabal1.20.0.2 (問題のプロジェクトはCabal sandboxにインストールしています。)
発生した問題: mecabを使ったプロジェクトでcabal install するとリンク中にエラーが発生する
Linking dist/dist-sandbox-e0def0a9/build/command-line/command-line ... Undefined symbols for architecture x86_64: "_mecab_get_all_morphs", referenced from: _cfSP_info in libHSmecab-0.4.0.a(MeCab.o) "_mecab_get_lattice_level", referenced from: _cfFl_info in libHSmecab-0.4.0.a(MeCab.o) "_mecab_get_partial", referenced from: _cfW9_info in libHSmecab-0.4.0.a(MeCab.o) "_mecab_get_theta", referenced from: _cfCP_info in libHSmecab-0.4.0.a(MeCab.o) "_mecab_set_all_morphs", referenced from: _cgo1_info in libHSmecab-0.4.0.a(MeCab.o) "_mecab_set_lattice_level", referenced from: _cfXT_info in libHSmecab-0.4.0.a(MeCab.o) "_mecab_set_partial", referenced from: _cfU5_info in libHSmecab-0.4.0.a(MeCab.o) "_mecab_set_theta", referenced from: _cfEc_info in libHSmecab-0.4.0.a(MeCab.o) ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) cabal: Error: some packages failed to install:
このエラーがいまいちよくわかってないのでなんとも言えないのですが、いろいろやっているうちにHaskellのMeCabパッケージにあるversionを使ってみると0.97が帰ってきて、意図的にインストールした0.996とは違うのでどこかに別のMeCabがあるのではないかと思っています
なおった
cabal installするときに、使いたいMeCabのあるディレクトリを渡してあげないとダメなようです。とりあえずこれで解決しました。
cabal install mecab --extra-include-dirs=/usr/local/Cellar/mecab/0.996/include/ --extra-lib-dirs=/usr/local/Cellar/mecab/0.996/lib/
これで動作するようになってからversionを見たら0.996となっていたので、どこかに前なんかやった時のゴミが残っててそれを見に行ってしまってたようですが、そのごみがどこにあるのかわからないので気持ち悪いです。 ひとまず解決。よかった。
追記:
でもまあMeCab 0.97なんてインストールした覚えがないんだよなあ、OSXに最初から含まれてるのかな……
— はる(ATMで紙幣が詰まる) (@haru2036) 2014, 8月 16
実際謎なので気持ち悪さが残りまくる。
追記2:まとめ
まとめ
FFIを使って他の言語のコードをリンクするようなプロジェクトの時はできるだけextra-lib-dirsとか渡したほうが面倒は少ないかもね(なげやり)