2017-11-10 5 views
1

(이 질문을 최대한 일반화하고 싶습니다.) 제목에 문제가있는 라이브러리를 가져 왔습니다.프로그램 오류 : ./program : 공유 라이브러리를로드하는 동안 오류 발생 : <xxx> .so : 공유 개체 파일을 열 수 없음 : 해당 파일 또는 디렉터리가 없습니다.

나는 프로젝트가 있는데, 그 프로젝트를 위해서 xxx 라이브러리가 필요합니다. 그래서 라이브러리를 다운로드하고 기본 명령 (./configure && make && make install && make clean)으로 컴파일합니다 - 설치 절차가 문서화되어 - 문서에 제공된 예제가 모든 것이 올바르게 설정되었는지 확인하기 위해 노력한 경우 시도했습니다. 내가 복사하고 .c 파일에 코드를 붙여 넣은 다음 명령으로 컴파일 :

gcc -o program program.c -lxxx 

그리고 GCC 보고서 오류없이합니다. 내가 프로그램을 실행하지만, 즉시, 다음과 같은 오류가 발생합니다

./program: error while loading shared libraries: lib<xxx>.so: cannot open shared object file: No such file or directory 

내 마음 -static GCC의 옵션을 사용하는 것이었다에 와서 첫 번째 솔루션입니다. 그것은 잘 작동하고 프로그램이 제대로 실행됩니다. 그러나 그것은 도서관이 프로그램에 "임베디드"되어 있음을 의미하기 때문에 실망했습니다 (잘못된 용어로 유감스럽게 생각합니다 : 나는 단지 학생입니다).

그래서 나는 스택 오버플로의 솔루션을 보았다 : 그게 내가 무엇을 발견 : error while loading shared libraries: libnsd.so: cannot open shared object file: No such file or directory

도서관이 다른

하지만

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH 

가 잘 작동 명령을 사용하여. 실제로 libxxx.so는/usr/local/lib에있다 (단지 ls /usr/local/lib | grep xxx을 사용). 스레드가 제안 다른, 영구적 인 해결책은 /etc/ld.so.conf를 파일에 디렉토리 이름을 작성하는 것입니다 :

sudo echo "/usr/local/lib" >> /etc/ld.so.conf 
sudo ldconfig 

그리고 그 까다로운 점이다 : ld.so.conf 파일에 다음 줄이 포함되어 그

/usr/local/lib 

내가 포함 약이 조금 혼란 스러워요 라인을 포함 libc.conf

include /etc/ld.so.conf.d/*.conf 

및 디렉토리 내부

는 /etc/ld.so.conf.d라는 파일이있다; C에서 #include와 똑같이 작동한다면 /etc/ld.so.conf 파일에/usr/local/lib가 있어야합니다. 그렇지 않은 것처럼 보입니다.

+0

라이브러리를 설치 한 후'rehash'를 실행 했습니까? –

+0

이 문제는 특히 C와 관련이 없습니다. – alk

+0

[man ldconfig] (https://linux.die.net/man/8/ldconfig) –

답변

3

/etc/ld.so.confldconfig으로 만 읽고 동적 로더 캐시 /etc/ld.so.cache을 채 웁니다. 해당 메커니즘을 통해 검색 경로에 포함 된 /usr/local/lib/usr/local/lib에 라이브러리를 넣으면 ldconfig을 먼저 실행하면 라이브러리를 사용할 수있게됩니다 (설정하지 않고 LD_LIBRARY_PATH).

+0

안녕하세요, 답장을 보내 주셔서 감사 드리며 답변을 드렸습니다. 나는 ld.so.cache에 대해 몰랐다 ... 나는 그것에 대해 좀 더 많은 연구를 할 것이다. 어쨌든, ldconfig를 실행하면 문제가 해결되었습니다. 그래서,/usr/local/lib에 동적로드 라이브러리를 설치할 때마다 캐시 파일을 새로 고쳐야합니다. – LuxGiammi

+0

예, 시스템 전체 라이브러리 설치가 권장되면'ldconfig'를 실행하십시오. –