0

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

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

现在,问题是,我怎样才能让这些库连接起来?

4

2 回答 2

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
于 2010-12-02T08:33:16.163 回答
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 库的正确链接

$ 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
于 2010-12-02T05:03:22.653 回答