読者です 読者をやめる 読者になる 読者になる

OSXでHaskellとMeCab

Haskell 自然言語処理

ハマったのでメモ。(割りとどうでも良い落ちだったのでアレ)

困った

環境: 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:

このエラーがいまいちよくわかってないのでなんとも言えないのですが、いろいろやっているうちにHaskellMeCabパッケージにある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となっていたので、どこかに前なんかやった時のゴミが残っててそれを見に行ってしまってたようですが、そのごみがどこにあるのかわからないので気持ち悪いです。 ひとまず解決。よかった。

追記:

実際謎なので気持ち悪さが残りまくる。
追記2:まとめ

まとめ

FFIを使って他の言語のコードをリンクするようなプロジェクトの時はできるだけextra-lib-dirsとか渡したほうが面倒は少ないかもね(なげやり)