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


356

프로그램은 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이 파일 이름의 일부라는 것을 알지 못했습니다. 어쨌든 그것은 무엇을 의미합니까?


277
최근에 공유 라이브러리를 설치하고 나중에 ldconfig (8)을 실행하지 않은 경우에 발생할 수 있습니다. 'ldconfig'를 수행하면 아무런 해가 없습니다.
AbiusX 2016 년

25
@AbiusX 주석에 +1-sudo ldconfig 실행 (라이브러리가 실제로 [/ usr / bin / lib /, / usr / bin / include /, / usr / local / lib / 및 / usr / local이어야하는 것으로 가정) / include / AFAIK], 내가 틀렸다면 수정 해주세요.) 해당 문제를 해결할 수 있습니다. 건배!
AeroCross

lib 파일에 대한 권한이 어떻게 든 변경된 경우에도이 오류가 발생할 수 있습니다. 권한을 644로 다시 변경하면 해결되었습니다.
Geoffrey H

답변:


139

업데이트
아래에서 작성하는 내용은 공유 라이브러리에 대한 일반적인 답변이지만, 이러한 종류의 메시지의 가장 흔한 원인은 패키지를 설치했지만 해당 패키지의 "-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 저녁을 먹지 않을 것이라고 보장하지는 않습니다.


5
... 오 갓, .1은 파일 이름의 일부입니다. 무슨 뜻인지 알 겠어?
zaratustra

orip은 해당 링크에 +1이 필요합니다. @orip이 마음에 들지 않으면 답변에 링크를 넣고 싶습니다.
Paul Tomblin

@PaulTomblin, grub을 복구하는 동안 비슷한 오류가 발생합니다. 이것에 대해 도와 줄 수 있습니까? 이 질문-> askubuntu.com/questions/123275/cant-repair-grub/…
Eray

@TomNysetvold와 Paul, 예-같은 문서입니다.
orip

이 답변을 검색 할 때 많은 나쁜 정보와 로터리 솔루션을 발견했습니다. 내 안에 뭔가 단일 명령 솔루션을 찾을 때까지 검색을 계속하라고 말했다.
c ..

326

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

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

(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


3
위에서 언급 한 답변은 매우 분명했습니다. 먼저 감사합니다. Eclipse CDT Project Path (Lubuntu) 에서이 작업을 시도했습니다. / Debug $ echo $ LD_LIBRARY_PATH /home/akhil/HDE/x86.linux/lib:/home/akhil/HDE/x86.linux/lib .. "/home/akhil/HDE/x86.linux/lib"이 곳은 내 라이브러리도 실제로 사용할 수 있지만 여전히 같은 오류가 발생합니다. 어떤 제안이라도!
nahasapeemapetilon

12
라이브러리를 내 보낸 후 "ldconfig"명령을 시도하십시오. 이 명령을 "sudo"로 실행해야 할 수도 있습니다.
XOR

5
단계 (1)의 모든 명령은 find단독 으로 수행 할 수 있습니다 .find / -name the_name_of_the_file.so
wbadart

3
나는 생각 LD_LIBRARY_PATH이 들어있는 디렉토리를 가리켜 야한다 path.so.something하지 않도록, path.so.something그 자체.
gerrit

2
단계별로 명령을 수행하면 내 문제가 해결되었습니다! 정말 감사합니다!
Fisher Coder

156

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

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

3
기본적으로 / lib 및 / usr / lib는 / usr / local / lib? 그것은 내 경력에 걸쳐 여러 번 나를 버리고 몇 시간을 낭비했습니다.
DarenW

@DarenW 나를 위해 / usr / local / lib와 함께 작동합니다. 우분투 14.04 LTS.
gon1332

추가 .conf내가 필요 비표준 lib 디렉토리 경로와 내 자신의 파일을 /etc/ld.so.conf.d(가 가리키는 /etc/ld.so.conf트릭을했다).
CivFan

4
ldconfig를 실행해야하는 경우 +1 패키지 관리자를 사용하지 않았습니다. 소스에서 컴파일해야했기 때문에 이것이 필요했습니다.
Jeff

7
이것이 실제 답변입니다
Scott Stensland

53

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

sudo ldconfig -v

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


37
Hiya, 이것은 문제를 해결할 수 있지만 ... 답을 편집하고 어떻게 그리고 왜 작동하는지에 대한 약간의 설명을 제공 할 수 있다면 좋을 것입니다 :) 잊지 마세요-스택 오버플로에 초보자가 많이 있습니다. 그리고 그들은 당신의 전문 지식에서 한두 가지를 배울 수 있습니다.
Taryn East

그는 그것을 설명 할 수 없습니다. 그는 방금 답변을 복사했습니다.
Jhourlad Estrella

중복 답변 ... 전날 위의 동일한 답변을 참조하십시오
Scott Stensland

25

.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에서 라이브러리를 찾도록합니다.

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


3
이것이 내가 찾던 옵션입니다. 아마도 더 나을 것입니다 -Wl,-rpath DIR.
jrw32982는 Monica

1
큰! 프로그램이 cmake로 성공적으로 컴파일되었지만 오류로 인해 시작할 수 없을 때 문제가 발생했습니다. 이 답변은 내 문제를 해결
Ivan Talalaev

15

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

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path_to_your_library

효과가있다!


13

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

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

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


7
cd /home/<user_name>/
sudo vi .bash_profile

이 줄을 끝에 추가하십시오

LD_LIBRARY_PATH=/usr/local/lib:<any other paths you want>
export LD_LIBRARY_PATH

5

비슷한 오류가 있었고 ~ / .bashrc에 LD_LIBRARY_PATH를 제공하는 것으로 수정되지 않았습니다. 내 문제를 해결 한 것은 .conf 파일을 추가하고로드하는 것입니다. su의 터미널로 이동하십시오.

gedit /etc/ld.so.conf.d/myapp.conf

이 파일에 라이브러리 경로를 추가하고 저장하십시오 (예 : / usr / local / lib). 경로를 활성화하려면 다음 명령을 실행해야합니다.

ldconfig

새 라이브러리 경로를 확인하십시오.

ldconfig -v | less

라이브러리 파일이 표시되면 계속 진행하십시오.


4

상황에 따라 다른 가능한 솔루션.

libpthread_rt.so.1이 libpthread_rt.so와 동일하다는 것을 알고 있다면 다음과 같이 심볼릭 링크를 만들 수 있습니다.

ln -s /lib/libpthread_rt.so /lib/libpthread_rt.so.1

그런 다음 ls -l /lib심볼릭 링크와 그 내용을 표시해야합니다.


4

Linux x86에서 Eclipse CDT로 애플리케이션을 실행할 때이 오류가 발생했습니다.
이 문제를 해결하려면

  1. 이클립스에서 :

    다음으로 실행-> 구성 실행-> 환경

  2. 경로를 설정

    LD_LIBRARY_PATH=/my_lib_directory_path
    

2

내가해야 할 일은 달렸다.

sudo apt-get install libfontconfig1

나는 위치한 폴더에 있었고 /usr/lib/x86_64-linux-gnu완벽하게 작동했습니다.


2

Microsoft Windows에서 애플리케이션을 실행중인 경우 PATH 환경 변수에 동적 라이브러리 (.dll)의 경로를 정의해야합니다.

UNIX에서 애플리케이션을 실행중인 경우 동적 라이브러리 (.so)의 경로는 LD_LIBRARY_PATH 환경 변수에 정의해야합니다.


1

sudo lib32z1을 설치하십시오

sudo apt-get 설치 lib32z1


1

시스템이 언급 된 라이브러리 파일을 참조 할 수 없으므로 오류가 발생합니다. 다음 단계를 수행하십시오.

  1. Running locate libpthread_rt.so.1은 해당 이름을 가진 모든 파일의 경로를 나열합니다. 경로가 있다고 가정 해 봅시다 /home/user/loc.
  2. 경로를 복사하고 실행하십시오 cd home/USERNAME. USERNAME을 파일을 실행할 현재 활성 사용자의 이름으로 바꾸십시오.
  3. 매개 변수 vi .bash_profile의 끝에서 실행 LD_LIBRARY_PATH하기 직전 .에 행을 추가하십시오 /lib://home/usr/loc:.. 파일을 저장하십시오.
  4. 터미널을 닫고 응용 프로그램을 다시 시작하십시오. 실행해야합니다.

0

나는이 오류가 발생했고 그 이유가 당신과 같은 이유라고 생각합니다.

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

이 시도. 파일에 대한 권한 수정 :

cd /opt/Popcorn (or wherever it is) 
chmod -R 555 * (755 if not ok) 
chown -R root:root *

파일 시스템에 대한 권한을 얻으려면“sudo su”.


0

나는이 오류가 발생했고 그 이유가 당신과 같은 이유라고 생각합니다.

공유 라이브러리를로드하는 동안 오류가 발생했습니다 : libnw.so : 공유 객체 파일을 열 수 없습니다 : 해당 파일 또는 디렉토리가 없습니다

이 시도. 파일에 대한 권한 수정 :

cd /opt/Popcorn (or wherever it is) 
chmod -R 555 * (755 if not ok) 

0

비슷한 문제가 여기에 있습니다 : https://bugzilla.redhat.com/show_bug.cgi?id=1456202 언급 한 솔루션을 시도했지만 실제로 작동합니다.

이전 질문의 해결책이 효과가있을 수 있습니다. 그러나 이것이 쉽게 해결할 수있는 방법이라고 생각합니다. libwbclient 페도라 에서 패키지를 다시 설치하십시오 .

dnf reinstall libwbclient

0

우분투 18.04를 사용합니다

해당 "-dev"패키지를 설치하면 효과가 있습니다.

sudo apt install libgconf2-dev

위 패키지를 설치할 때까지 아래 오류가 발생했습니다.

turtl: error while loading shared libraries: libgconf-2.so.4: cannot open shared object file: No such file or directory
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.