java.lang.UnsatisfiedLinkError - загрузка нескольких файлов lib? - PullRequest
0 голосов
/ 02 декабря 2010

Сначала эта ошибка выглядела нормально для меня, но после того, как я попробовал все известные вещи, мне все еще не повезло с запуском моей программы.Поэтому, пожалуйста, позвольте мне объяснить подробнее.

Я пытаюсь запустить пример TC (TokyoCabinet), используя java api TC на Ubuntu.И 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 ]

1 голос
/ 02 декабря 2010

Лучшее решение - изменить Makefile перед запуском make и make install.

Внутри Makefile заменить LIBS на

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

Добавить lib dc tc в новый файл tc.conf под ld.so.conf.d

$ 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)

Выполнить проверки ТС

make check

Теперь установите библиотеку

make install
0 голосов
/ 02 декабря 2010

Я думаю, что решил это. Это была проблема при создании нативной библиотеки 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
...