[linux] 공유 라이브러리를로드하는 중 Linux 오류 : 공유 객체 파일을 열 수 없습니다 : 해당 파일 또는 디렉토리가 없습니다

프로그램은 Xenomai 테스트 스위트의 일부이며 Linux PC에서 Linux + Xenomai ARM 툴체인으로 크로스 컴파일됩니다.

# echo $LD_LIBRARY_PATH
/lib
# ls /lib
ld-2.3.3.so         libdl-2.3.3.so      libpthread-0.10.so
ld-linux.so.2       libdl.so.2          libpthread.so.0
libc-2.3.3.so       libgcc_s.so         libpthread_rt.so
libc.so.6           libgcc_s.so.1       libstdc++.so.6
libcrypt-2.3.3.so   libm-2.3.3.so       libstdc++.so.6.0.9
libcrypt.so.1       libm.so.6
# ./clocktest
./clocktest: error while loading shared libraries: libpthread_rt.so.1: cannot open shared object file: No such file or directory

편집 : OK 끝에 .1이 파일 이름의 일부라는 것을 알지 못했습니다. 어쨌든 그것은 무엇을 의미합니까?



답변

업데이트
아래에서 작성하는 내용은 공유 라이브러리에 대한 일반적인 답변이지만, 이러한 종류의 메시지의 가장 흔한 원인은 패키지를 설치했지만 해당 패키지의 “-dev”버전을 설치하지 않았기 때문이라고 생각합니다.


글쎄, 그것은 거짓말을하지 않습니다- libpthread_rt.so.1그 목록에 없습니다 . 가지고있는 라이브러리에 따라 달라 지도록 재구성하고 다시 빌드하거나 제공하는 모든 것을 설치해야합니다 libpthread_rt.so.1.

일반적으로 .so 뒤의 숫자는 버전 번호이며, 종종 서로 링크되어 있음을 알 수 있습니다. libfoo.so 버전 1.1이 있으면 실제 파일 libfoo.so.1.0, libfoo.so.1.0을 가리키는 심볼릭 링크 foo.so 및 foo.so.1 그리고 다른 버전을 제거하지 않고 버전 1.1을 설치하면 libfoo.so.1.1이 생성되고 libfoo.so.1 및 libfoo.so가 새 버전을 가리 키지 만 정확한 버전이 필요한 코드는 libfoo.so.1.0 파일을 사용하십시오. 버전 1 API에만 의존하지만 1.0 또는 1.1인지 상관하지 않는 코드는 libfoo.so.1을 지정합니다. 으로 orip이 코멘트에 지적이에 잘 설명되어 http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html .

귀하의 경우에는, 당신은 할 수 심볼릭 링크와 함께 도망 libpthread_rt.so.1libpthread_rt.so. 그러나 코드를 위반하지 않고 TV 저녁을 먹지 않을 것이라고 보장하지는 않습니다.


답변

라이브러리는 동적 라이브러리입니다. 런타임에 운영 체제를 찾을 수있는 위치를 운영 체제에 알려야합니다.

그렇게하려면 다음과 같은 쉬운 단계를 수행해야합니다.

(1) 라이브러리를 모를 경우 라이브러리 위치를 찾으십시오.

sudo find / -name the_name_of_the_file.so

(2) 동적 라이브러리 경로 환경 변수가 있는지 확인하십시오 ( LD_LIBRARY_PATH)

$ echo $LD_LIBRARY_PATH

표시 할 것이 없으면 기본 경로 값을 추가하십시오 (또는 원하지 않는 경우).

$ LD_LIBRARY_PATH=/usr/local/lib

(3) 우리는 원하는 경로를 추가하고 내보내고 응용 프로그램을 시도합니다.

경로는 path.so.somethingis가 있는 디렉토리 여야합니다 . 그래서 경우 path.so.something/my_library/path.so.something그것을해야한다 :

$ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_library/
$ export LD_LIBRARY_PATH
$ ./my_app

출처 : http://www.gnu.org/software/gsl/manual/html_node/Shared-Libraries.html


답변

시도해 볼 수있는 몇 가지 솔루션은 다음과 같습니다.

ldconfig

AbiusX가 지적한 바와 같이 : 방금 라이브러리를 설치했다면 ldconfig 를 실행하면 됩니다.

sudo ldconfig

ldconfig는 명령 줄에 지정된 디렉토리, /etc/ld.so.conf 파일 및 신뢰할 수있는 디렉토리 (/ lib 및 / usr / lib)에있는 가장 최근의 공유 라이브러리에 필요한 링크와 캐시를 만듭니다.

일반적으로 패키지 관리자는 새 라이브러리를 설치할 때이를 처리하지만 항상 그런 것은 아닙니다. ldconfig를 실행해도 문제가되지는 않습니다.

개발 패키지 또는 잘못된 버전

그래도 문제가 해결되지 않으면 Paul의 제안을 확인 하고 라이브러리의 “-dev”버전을 찾으십시오. 많은 라이브러리는 dev 및 non-dev 패키지로 나뉩니다. 이 명령을 사용하여 찾을 수 있습니다.

apt-cache search <libraryname>

라이브러리의 잘못된 버전을 설치 한 경우에도 도움이 될 수 있습니다. 일부 라이브러리는 서로 다른 버전으로 동시에 게시됩니다 (예 : Python).

도서관 위치

올바른 패키지가 설치되어 있고 ldconfig가 찾지 못한 경우 비표준 디렉토리에있을 수 있습니다. 기본적으로 ldconfig를은으로 보이는 /lib, /usr/lib그리고 디렉토리에 나열 /etc/ld.so.conf하고 $LD_LIBRARY_PATH. 라이브러리가 다른 곳에있는 경우,에 자신의 줄에 디렉토리를 /etc/ld.so.conf추가하거나에 라이브러리 경로를 추가 $LD_LIBRARY_PATH하거나 라이브러리를로 이동하십시오 /usr/lib. 그런 다음를 실행하십시오 ldconfig.

라이브러리의 위치를 ​​알려면 다음을 시도하십시오.

sudo find / -iname *libraryname*.so*

( libraryname도서관 이름으로 교체 )

$LD_LIBRARY_PATH경로 를 따라 가면 ~/.bashrc파일 에 넣을 때마다 로그인 할 때마다 실행되도록해야합니다.

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/library


답변

비슷한 오류가 발생했습니다.

sudo ldconfig -v

도움이 되었기를 바랍니다.


답변

.c 파일을 컴파일 할 때 링크하는 동안 라이브러리 경로를 지정해야합니다.

gcc -I / usr / local / include xxx.c -o xxx -L / usr / local / lib -Wl, -R / usr / local / lib

-Wl, -R 부분은 결과 바이너리가 / usr / lib /에있는 라이브러리를 사용하기 전에 런타임에 / usr / local / lib에서 라이브러리를 찾도록합니다.

그것이 도움이되기를 바랍니다.


답변

LD_LIBRARY_PATH검색 경로를 나타내는을 ~/.bashrc파일에 추가 하십시오.

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path_to_your_library

효과가있다!


답변

linux.org 참조 페이지는 역학을 설명하지만 그 동기를 설명하지는 않습니다 🙁

이에 대해서는 Sun 링커 및 라이브러리 안내서를 참조하십시오.

또한 심볼 버전 (GNU 확장)을 사용하면 단일 라이브러리에 동일한 기능의 여러 호환되지 않는 버전이있을 수 있으므로 “외부 버전 관리”는 Linux에서 거의 사용되지 않습니다. 이 확장을 통해 glibc libc.so.6는 지난 10 년 동안 동일한 외부 버전을 사용할 수있었습니다 .