Kyoto CabinetのJavaバインディングにハマる
バイナリインストールでもいいんですけどね.
慣れてないものは,ソースから入れると色々知らないことが分かっていいので,最初はソースで入れることにしています.
> wget http://fallabs.com/kyotocabinet/javapkg/kyotocabinet-java-1.21.tar.gz > tar xvf kyotocabinet-java-1.21.tar.gz > cd kyotocabinet-java-1.21 > setenv JAVA_HOME /usr/local/jdk1.6.0_20 > ./configure --prefix=/usr/local --with-kc=/usr/local > make > su # make install # exit > make check make DBNAME=":" RNUM="10000" check-each make[1]: Entering directory `/home/hoge/kyotocabinet-java-1.21' rm -rf casket* LD_LIBRARY_PATH=.:/lib:/usr/lib:/usr/local/lib:/usr/local/lib /usr/local/jdk1.6.0_20/bin/java -cp kyotocabinet.jar -Djava.library.path=.:/usr/local/lib kyotocabinet.Test order \ ":" "10000" Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/hoge/kyotocabinet-java-1.21/libjkyotocabinet.so.1.1.0: /home/hoge/kyotocabinet-java-1.21/libjkyotocabinet.so.1.1.0: undefined symbol: _ZTIN12kyotocabinet6ThreadE at java.lang.ClassLoader$NativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1803) at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1728) at java.lang.Runtime.loadLibrary0(Runtime.java:823) at java.lang.System.loadLibrary(System.java:1028) at kyotocabinet.Loader.load(Loader.java:35) at kyotocabinet.Utility.<clinit>(Utility.java:31) at kyotocabinet.Test.runorder(Test.java:115) at kyotocabinet.Test.main(Test.java:35) make[1]: *** [check-each] Error 1 make[1]: Leaving directory `/home/hoge/kyotocabinet-java-1.21' make: *** [check] Error 2
あり?
これ,アレですね.Kyotocabinet6Thread...つまりlibkyotocabinet.soが見えてませんね.
なので,libjkyotocabinet.soを作るMakefileに,libkyotocabinet.soをリンクするように修正しました.
/home/hoge/kyotocabinet-java-1.21/Makefileに,次のような変更を加えただけです.
LIBS = -lz -lstdc++ -lrt -lpthread -lm -lc ↓ LIBS = -lz -lstdc++ -lrt -lpthread -lm -lc -lkyotocabinet
そして
> make clean;make > su # make install # exit > make check (中略) #================================================================ # Checking completed. #================================================================ >
OKです.