태그 보관물: dynamic-linking

dynamic-linking

우분투는 공유 라이브러리를 어디에서 찾습니까? /usr/local/lib되었으며 두 플랫폼 모두에 있습니다. 코드를 컴파일

런타임에 공유 라이브러리에 링크하는 프로세스를 실행할 때 (프로세스가 시작될 때 링크되고 나중에 링크되지 않음 ) 다른 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



답변

이 전체 경로 비즈니스는 다중 아키텍처라는 것과 관련이 있습니다. 기본적으로 동일한 시스템에서 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.


답변

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

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

그래서 나는 달렸다

sudo ldconfig /usr/lib64

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


답변