2010-12-02 40 views
0

起初,這個錯誤看起來很正常,但在嘗試了所有已知的事情之後,我仍然沒有運行我的程序。所以請讓我詳細解釋一下。java.lang.UnsatisfiedLinkError - 加載多個lib文件?

我想在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

我想我已經解決了它。 構建原生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 
1

更好的方法是在運行'make'和'make install'之前更改Makefile。

裏面的Makefile代替LIBS由

LIBS = -lbz2 -lz -lpthread -lm -lc /home/siddharth/tools/tc/lib/libtokyocabinet.so.9 

在新tc.conf文件添加TC的lib目錄下的ld.so.conf中。d

$ cat /etc/ld.so.conf.d/tc.conf 
/home/siddharth/tools/tc/lib 

運行ldconfig

sudo ldconfig -v 

構建TC-java的 使INCLUDEDIR = 「/家/亞洲時報Siddharth /工具/ TC /包括」 LIBDIR =「/家/亞洲時報Siddharth /工具/ 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 
+0

與LDD首先要經常檢查,因爲它給你「libfoo.so =>未找到」快速眼球檢查 – kittylyst 2014-12-28 15:27:43

相關問題