2010-12-02 2 views
0

처음에이 오류는 나에게 정상적으로 보였지만 알려진 모든 것을 시도한 후에도 내 프로그램을 실행하는 데 아무런 운이 없었습니다. 그러니 자세히 설명해주십시오.java.lang.UnsatisfiedLinkError - 복수의 lib 파일을로드 중입니까?

우분투에서 TC의 자바 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 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 
1

'make'와 'make install'을 실행하기 전에 Makefile을 변경하십시오.

내부 메이크는 ld.so.conf에 새 tc.conf 파일에 TC의 lib 디렉토리 디렉토리를 추가

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

에 의해 LIBS를 교체합니다.D

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

실행 ldconfig를

sudo ldconfig -v 

빌드 TC-자바 할 includedir을 = "/ 홈/싯다 르트 나라 얀/도구/TC/포함"LIBDIR = "/ 홈/싯다 르트 나라 얀/도구/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 수표

012,351,641을 연결하는 경우
make check 

지금은 당신에게 "libfoo.so => ​​찾을 수 없음"에 대한 빠른 안구 검사를주기 때문에 항상 LDD 먼저 확인 라이브러리를

make install 
+0

설치 – kittylyst