libchasen.so: undefined symbol: cerr
JavaからJNIでCaboChaを呼ぶと上記のエラーが出る。
以下、とりあえず状況の整理をしてみた。Linuxで検証したけど多分Windowsでも同じだと思う。
libchasen.soはlibstdc++.aがリンクされていないので、呼び出し元にリンクしておく必要がある。
ところで、AというプログラムがBというライブラリをロードして、BがCという別のライブラリをロードした状況では、Cが必要とするライブラリは(Bではなく)Aにリンクされていないといけない(らしい)。
さて、ここでA=java,B=libcabocha.so,C=libchasen.soとすると、libchasen.soが必要とするlibstdc++.aがJavaにリンクされていない(当然)ので、エラーになるわけだ。
参考リンク
- [chasen-users:00403]FreeBSD 4.8-R への chasen-2.3.3 Perl モジュールのインストール
- ChaSen's Wiki - FAQ: (たぶん) よくある質問
- Google Code Archive - Long-term storage for Google Code Project Hosting.
- hellohiro.com
ここまで分かって、じゃあどうすればいいかというとちょっと思い付かない。そもそもlibchasen.soにlibstdc++.aをリンクしてしまってもいいのか?
最後に、最小限のテストコードを載せておく。
- test_a.c
#include <stdio.h> #include <dlfcn.h> typedef void (*FUNCPTR)(); int main(int argc, char *argv[]) { void *hLib = dlopen("libtest_b.so", RTLD_LAZY); if (hLib == NULL) { fprintf(stderr, __FILE__": Error: %s\n", dlerror()); } else { FUNCPTR func; fprintf(stderr, __FILE__": Library loaded.\n"); func = dlsym(hLib, "func"); if (func) { (*func)(); } else { fprintf(stderr, __FILE__": Error: %s\n", dlerror()); } dlclose(hLib); } return 0; }
- test_b.c
#include <stdio.h> #include <dlfcn.h> void func() { void *hLib = dlopen("libchasen.so", RTLD_LAZY); if (hLib == NULL) { fprintf(stderr, __FILE__": Error: %s\n", dlerror()); } else { fprintf(stderr, __FILE__": Library loaded.\n"); dlclose(hLib); } }
- コンパイル方法
% gcc -Wall test_a.c -o test_a -ldl % gcc -Wall test_a.c -o test_a++ -ldl -lstdc++ % gcc -shared -Wall test_b.c -o libtest_b.so -ldl -lstdc++
- 実行結果
% LD_LIBRARY_PATH=. ./test_a++ test_a.c: Library loaded. test_b.c: Library loaded. % LD_LIBRARY_PATH=. ./test_a test_a.c: Library loaded. test_b.c: Error: /usr/lib/libchasen.so: undefined symbol: cerr %
Re: http記法について
id:hatenadiary:20040915#1095241004
コメントに書こうかと思ったけど、こっちに書いてトラックバックすることにしよう。
http記法で、タイトルに[や]が含まれるとそこまでで切られてしまうようですが、何とかなりませんか?メーリングリストの過去ログ等では、これらの文字が使われていることが割と良くあるので、対処してもらえると嬉しいです。
あと、[id:hatenadiary:20040915#1095241004:title=http記法について]みたいな書き方はできないんでしょうか。