Programing

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

lottogame 2020. 3. 11. 00:42
반응형

공유 라이브러리를로드하는 중 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에서 라이브러리를 찾도록 지시합니다.

그것이 당신을 도울 것입니다 바랍니다.


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

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

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


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

LD_LIBRARY_PATH=path_to_your_library

효과가있다!


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

이 줄을 끝에 추가하십시오

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

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

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

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

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


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

  1. 이클립스에서 :

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

  2. 경로를 설정

    LD_LIBRARY_PATH=/my_lib_directory_path
    

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

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

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

ldconfig

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

ldconfig -v | less

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


sudo lib32z1을 설치하십시오

sudo apt-get 설치 lib32z1


내가해야 할 일은 달렸다.

sudo apt-get install libfontconfig1

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


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

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


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

  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. 터미널을 닫고 응용 프로그램을 다시 시작하십시오. 실행해야합니다.

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

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”


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

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

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

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

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

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

dnf reinstall libwbclient

참고 URL : https://stackoverflow.com/questions/480764/linux-error-while-loading-shared-libraries-cannot-open-shared-object-file-no-s

반응형