우분투는 공유 라이브러리를 어디에서 찾습니까?


24

런타임에 공유 라이브러리에 링크하는 프로세스를 실행할 때 (프로세스가 시작될 때 링크되고 나중에 링크되지 않음 ) 다른 dlload()공유 라이브러리 ( .so) 파일 을 어디에서 찾 LD_LIBRARY_PATH습니까?

배경:

특정 타사 라이브러리를 사용하는 필자가 작성한 C ++ 코드가 있습니다. 라이브러리를 설치하고 코드를 우분투이지만 다른 버전과 gcc의 다른 두 가지 플랫폼으로 컴파일했습니다. 라이브러리는 소스에서 컴파일 및 설치 /usr/local/lib되었으며 두 플랫폼 모두에 있습니다. 코드를 컴파일 할 때 pkg-config --libs타사 라이브러리 의 매개 변수 와 연결하고 pkg-config --libs두 플랫폼에서 똑같은 것을 반환 한다는 것을 확인했습니다 .

내 코드는 두 플랫폼 모두에서 성공적으로 컴파일되며 두 플랫폼 모두에서 LD_LIBRARY_PATH정의되거나 비어있는 것으로 정의되지 않습니다 "". 그러나 한 플랫폼에서 실행하면 정상적으로 작동하고 다른 플랫폼에서는이 오류가 발생합니다.

error while loading shared libraries: libthrift-0.9.0.so: cannot open shared object file: No such file or directory

재미있게도 작동 하지 않는 것은 우분투와 gcc 의 최신 버전입니다. : /

그래서 작업중 인 라이브러리가 라이브러리를 찾는 방법을 알아 내려고하여 깨진 라이브러리가 같은 방식으로 라이브러리를 찾도록 할 수 있습니다. (즉, 설정하지 않고 LD_LIBRARY_PATH)

최신 정보:

다음은 내 출력입니다. cat /etc/ld.so.conf.d/*

... 작동하는 (이전) 시스템에서 :

/usr/lib/mesa
/usr/lib32/mesa
/usr/lib/alsa-lib
# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu

... 깨진 (새로운) 시스템에서 :

# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/mesa

1
그 장소는에 정의되어 있다고 생각 /etc/ld.so.conf.d/*.conf하지만 확실하지 않습니다.
Salem

그 것처럼 보이지만 해당 파일의 내용에 대한 OQ 업데이트를 참조하십시오 ... 그래서 찾아야 /usr/local/lib/libthrift-0.9.0.so하지만 여전히 오류가 발생합니다 error while loading shared libraries: libthrift-0.9.0.so: cannot open shared object file: No such file or directory... 디렉토리를 선택 하지 않은 이유 가 /etc/ld.so.conf.d/*.conf있습니까?
Dave Lillethun

3
sudo ldconfig -v아래 제안대로 실행하십시오 . 여전히 작동하지 않으면의 출력으로 질문을 업데이트하십시오 ldd /path/to/your/application.
Salem

답변:


29

이 전체 경로 비즈니스는 다중 아키텍처라는 것과 관련이 있습니다. 기본적으로 동일한 시스템에서 32 비트 및 64 비트 라이브러리를 가질 수 있습니다.

파일을 복사 한 후 ldconfig를 실행 했습니까?

ldconfig  creates,  updates,  and removes the necessary links and cache
       (for use by the run-time linker,  ld.so)  to  the  most  recent  shared
       libraries  found  in  the directories specified on the command line, in
       the file /etc/ld.so.conf, and in the trusted directories (/usr/lib  and
       /lib).   ldconfig  checks the header and file names of the libraries it
       encounters when determining which  versions  should  have  their  links
       updated.  ldconfig ignores symbolic links when scanning for libraries.

나는 달려서 sudo ldconfig문제를 해결했다! (나의 코드 나 다른 것을 다시 컴파일 할 필요가 없었습니다 ...) 이해하고 싶을뿐입니다 ... "파일을 복사 한 후"라고 말했지만 파일을 복사하지 않았습니다. 라이브러리를 빌드 및 설치 한 후 또는 프로그램을 컴파일 한 후입니까?
Dave Lillethun

배치 한 곳에 배치 한 후 기본적으로 라이브러리 캐시가 작성됩니다. 재부팅하면 캐시가 다시 작성 될 수 있습니다.
Matt H

오해 할 수도 있지만 라이브러리를 설치 한 후 재부팅 한 것 같습니다 ... 그러나 sudo ldconfig트릭을 수행했습니다. 이것은 설치의 일부로 라이브러리가 종종 자동으로 실행되는 것이며, 어떤 이유로 라이브러리가 자동으로 실행되지 않습니까? 내가 왜 "정상적으로"이 작업을 수행하지 않아야하는지 궁금해하는 경우가 있지만이 경우에만 ...
Dave Lillethun

일반적으로 패키지 설치는 내가 생각하는 설치 과정에서 ldconfig를 실행합니다. 최신 배포판의 버전이 어떤 이유로 작동하지 않을 수 있습니다.
Matt H

1

위의 질문에 포함 된 정보와 첫 번째 (ATT 만) 대답WSL Ubuntu (Win10 64) 에서 비슷한 문제를 해결하는 데 도움이되었습니다 !

제 경우 에는 실행 파일이 라이브러리를 찾을 수 없습니다. 나는 궁극적으로 새로 만든 라이브러리에 배치되었다 것으로 나타났습니다 /usr/lib64, 하지만 의 멀티 아치 라인 /etc/ld.so.conf.d/x86_64-linux-gnu.conf 않았다 없는 디렉토리를 포함한다.

그래서 나는 달렸다

sudo ldconfig /usr/lib64

마침내 문제가 해결되었습니다. (디렉토리 매개 변수없이 단독으로 실행해도 라이브러리 BTW를 '마 법적으로'찾을 수는 없습니다.) 내 WSL bash가 '다시 시작'되었는지 도움이되는지 확실하지 않습니다.


/ usr / local / lib /도 마찬가지입니다. 파일을 만든 /etc/ld.so.conf.d/usr-local.conf다음 sudo ldconfig아무런 효과없이 실행 되었습니다. 로더에서 해당 디렉토리의 라이브러리를 찾을 수 없었습니다. 실행 후 sudo ldconfig /usr/local/lib모든 것이 잘 작동했습니다.
Josh Milthorpe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.