起初,这个错误看起来很正常,但在尝试了所有已知的事情之后,我仍然没有运行我的程序。所以,请让我详细解释一下。
我正在尝试在Ubuntu上使用TC的java api运行TC(TokyoCabinet)示例。 TC和Tc-java都已正确构建并安装在我的主目录中。 (不是/ usr / local / lib)。
我正在运行程序,如 -
$ java -Djava.library.path=/home/siddharth/tools/tc-java/lib -classpath ./bin/:lib/tokyocabinet.jar HdbTest
收到以下错误 -
Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/siddharth/tools/tc-java/lib/libjtokyocabinet.so.1.1.0: /home/siddharth/tools/tc-java/lib/libjtokyocabinet.so.1.1.0: undefined symbol: tcversion
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1751)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1676)
at java.lang.Runtime.loadLibrary0(Runtime.java:822)
at java.lang.System.loadLibrary(System.java:993)
at tokyocabinet.Loader.load(Loader.java:41)
at tokyocabinet.HDB.<clinit>(HDB.java:37)
at HdbTest.main(HdbTest.java:10)
现在,此错误与符号“tcversion”有关。所以我跑了 -
$ nm /home/siddharth/tools/tc-java/lib/libjtokyocabinet.so.1.1.0 | grep -i tcversion
U tcversion
这意味着tcversion不存在。
实际上tcversion在主TC库中
$ nm /home/siddharth/tools/tc/lib/libtokyocabinet.so | grep -i tcversion
0008096c D tcversion
现在,问题是,我该如何连接这些库?
答案 0 :(得分:1)
更好的解决方案是在运行'make'和'make install'之前更改Makefile。
在Makefile内部用
替换LIBSLIBS = -lbz2 -lz -lpthread -lm -lc /home/siddharth/tools/tc/lib/libtokyocabinet.so.9
在ld.so.conf.d下的新tc.conf文件中添加tc的lib目录
$ cat /etc/ld.so.conf.d/tc.conf
/home/siddharth/tools/tc/lib
运行ldconfig
sudo ldconfig -v
构建tc-java make INCLUDEDIR =“/ home / siddharth / tools / tc / include”LIBDIR =“/ home / siddharth / tools / tc / lib”
检查其链接是否正确
$ ldd libjtokyocabinet.so
linux-gate.so.1 => (0xb7fd7000)
libbz2.so.1.0 => /lib/libbz2.so.1.0 (0xb7fa0000)
libz.so.1 => /usr/lib/libz.so.1 (0xb7f8b000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7f72000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7f4d000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7dfe000)
libtokyocabinet.so.9 => /home/siddharth/tools/tc/lib/libtokyocabinet.so.9 (0xb7d82000)
/lib/ld-linux.so.2 (0xb7fd8000)
librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb7d79000)
运行TC的支票
make check
现在安装库
make install
答案 1 :(得分:0)
我想我已经解决了。 这是构建本机java库时的一个问题。
我尝试使用
重建它make LDFLAGS="-L/home/siddharth/tools/tc/lib" LIBS="/home/siddharth/tools/tc/lib/libtokyocabinet.so.9.9.0" INCLUDEDIR="/home/siddharth/tools/tc/include"
现在ldd显示了TC libs的正确链接
$ ldd /home/siddharth/tools/tc-java/lib/libjtokyocabinet.so
libtokyocabinet.so.9 => /home/siddharth/tools/tc/lib/libtokyocabinet.so.9 (0x003dc000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00d1c000)
libbz2.so.1.0 => /lib/libbz2.so.1.0 (0x007f7000)
libz.so.1 => /lib/libz.so.1 (0x001d8000)
librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0x00cd7000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x00110000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x00ace000)
/lib/ld-linux.so.2 (0x0062a000)
我的测试程序现在运行得很好
$ java -Djava.library.path=/home/siddharth/tools/tc-java/lib -classpath ./bin/:lib/tokyocabinet.jar HdbTest
hop
foo:hop
bar:step
baz:jump