他の方のリポジトリにビルドすると表題のエラーが出てしまった。
bluele/mecab-golang
をimportしている(CGOの設定が必要だった)のが原因だったのでメモしておく。
TL;DR
bluele/mecab-golang
をimport
するリポジトリの場合はgo get
・dep
などのimport
解決だけでは不十分- Macの場合は
brew install mecab
でmecab
をインストールする - 環境変数を設定しておく必要がある。
CGO_LDFLAGS
を設定してビルドをすれば問題ない
Undefined symbols for architecture x86_64
git clone
、go get ./...
後のあるリポジトリのtestを実行しようとしたところ、以下のエラーが出てしまった。
$ go test
# github.com/bluele/mecab-golang
Undefined symbols for architecture x86_64:
"_mecab_destroy", referenced from:
__cgo_41e1bb9c719c_Cfunc_mecab_destroy in _x005.o
(maybe you meant: __cgo_41e1bb9c719c_Cfunc_mecab_destroy)
....
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
FAIL github.com/budougumi0617/mecab-project [build failed]
どうやらimport
しているbluele/mecab-golang
がmecab
関係のCGO関数をきちんと呼べていないのが原因のようだった。
環境変数を設定してgo getをやり直す
解決方法はbluele/mecab-golang
のREADMEを見ればすぐにわかった。
- Getting started | bluele/mecab-golang
MacOSの場合はbrew経由でmecab
とmecab-config
をインストールできる。
$ brew install mecab
$ which mecab
/usr/local/bin/mecab
$ which mecab-config
/usr/local/bin/mecab-config
インストール後はbluele/mecab-golang
のREADME通りに環境変数を設定すればよい。
不要かもしれないが、私はgo get
もやり直しておいた。
$ export CGO_LDFLAGS="`mecab-config --libs`"
$ export CGO_CFLAGS="-I`mecab-config --inc-dir`"
$ go get -u github.com/bluele/mecab-golang
とはいえ、mecab
以外のCGOの設定などもあってexport
で設定はしたくないという人(自分)もいるだろう。
そのような人は以下のようにコマンド実行時にCGO_LDFLAGS
を渡せばよい。
$ CGO_LDFLAGS="`mecab-config --libs`" go test
PASS
ok github.com/budougumi0617/mecab-project 0.018s
ちなみにmecab-config --libs
が出力する結果は以下だった。
$ mecab-config --libs
-L/usr/local/Cellar/mecab/0.996/lib -lmecab -lstdc++