2017-09-14 23 views
4

지정된 이름을 표시하지 않습니다공유 객체 라이브러리를 구축 : LDD 내가 데비안에서 공유 객체 라이브러리를 구축하기 위해 노력하고있어

cat /etc/issue 
Debian GNU/Linux 9 \n \l 

내가 (wrap.c 생성하는 래퍼 역할을 정상적으로 라이브러리와 객체를 구축 나는 다음 test.c을 만들

gcc -c -fPIC -W -Wall -O2 -funroll-loops wrap.c 
gcc -shared -Wl,-soname,libtest.so -o libtest.so *.o 
mv libtest.so /usr/local/lib/ && mv test-header.h /usr/local/include/ 

모든 오브젝트 파일) 라이브러리에 끌어 다음과 같이 성공적으로 컴파일합니다 :

gcc test.c -ltest

그러나, 다음과 같은 오류를 반환 ./a.out 프로그램 실행 :

./a.out: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory

.so를 검사를, 나는 참조 :

$ ldd /path/to/libtest.so 
    linux-vdso.so.1 (0x00007ffdb71c5000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1c22fba000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007f1c23560000) 

심지어 적어도 말할 것이다, libtest.so => none 표시되지 않습니다 나 도서관을 찾을 수 없어.

나는 여기서 무슨 일이 일어나고 있는지 잘 모르겠습니다.

동일한 프로세스 (gcc -dynamiclib -o libtest.dylib *.o)를 사용하여 을 macOS에 성공적으로 만들고 성공적으로 실행 파일로 라이브러리를 호출 할 수 있습니다. 데비안에서는 어떤 점이 다른지 잘 모르겠습니다. /usr/local/lib 한 링커의 기본 검색 경로이기 때문에

답변

2

당신이 /usr/local/lib에 을 배치 한 공유 라이브러리 libtest.so은 명령

gcc test.c -ltest 

에 링커에 의해 위치합니다. 어떤 경우, 런타임 로더는 변수 LD_LIBRARY_PATH의 값에 나열된 보다는 직접 다른 디렉토리를 검색하지 않기 때문에 ./a.out을 실행하려고 할 때

그러나, 는 런타임 로더 에 의해이 위치하지 않습니다 현재 환경에서는 입니다. 기본적으로 ldconfig 캐시에 등록 된 라이브러리를 검색하고 (루트로)을 실행하여 새로 출현 한 라이브러리 만 등록하도록 캐시가 업데이트됩니다.

그래서 당신은 두 가지 옵션이 프로그램을 실행하려면 : -

현재 쉘에서의 성공을 위해

, 실행의 성공을 지속에 대한

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib; ./a.out 

을 실행

sudo ldconfig 

그런 다음 프로그램은 모든 쉘에서 실행됩니다.

BTW, ldd /path/to/libtest.so은 공유 라이브러리 종속성이 libtest.so임을 알려줍니다. 그것은 이 아니기 때문에 ./a.out이 실행되지 않아 이라는 메시지가 나타나면 /path/to/libtest.so을 찾으십시오. 공유 라이브러리 의존성을 확인하려면 이 a.out 인 경우 ldd a.out

+1

링크 할 때 [-Wl, -rpath, /]로 [rpath] (https://en.wikipedia.org/wiki/Rpath)를 설정하는 것이 좋습니다. usr/local/lib' –

+0

@Mikke Kinghan Doh ....! 저는 완전히 실행하기보다는 라이브러리에서 ldd를 사용하고 있다고 두려워했습니다. 웬일인지, 그것은 나를 완전히 버렸다. 통찰력을 고맙게 여기십시오! – floopy