java.lang.UnsatisfiedLinkError - 加载多个lib文件?

时间:2010-12-02 04:22:40

标签: java java-native-interface tokyo-cabinet

起初,这个错误看起来很正常,但在尝试了所有已知的事情之后,我仍然没有运行我的程序。所以,请让我详细解释一下。

我正在尝试在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

现在,问题是,我该如何连接这些库?

2 个答案:

答案 0 :(得分:1)

更好的解决方案是在运行'make'和'make install'之前更改Makefile。

在Makefile内部用

替换LIBS
LIBS = -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