2011-01-03 5 views
19

Linux에서 C++ 실행 파일을 작성합니다. 실행 파일은 일부 부스트 라이브러리에 링크됩니다.공유 라이브러리를로드하는 중 오류가 발생했습니다. libboost_system.so.1.45.0 : 공유 객체 파일을 열 수 없습니다. 해당 파일 또는 디렉토리가 없습니다.

[email protected]:~/work/dev/c++/projects/testfgci/dist/Debug/GNU-Linux-x86$ ./testfgci 
./testfgci: error while loading shared libraries: libboost_system.so.1.45.0: cannot open shared object file: No such file or directory 

내가 다음 종속성을 확인하기 위해 바이너리에 LDD를 실행합니다 :

[email protected]:~/work/dev/c++/projects/testfgci/dist/Debug/GNU-Linux-x86$ ldd testfgci 
    linux-gate.so.1 => (0x00380000) 
    libboost_system.so.1.45.0 => not found 
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00b50000) 
    libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x005f6000) 
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x0099a000) 
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x001b3000) 
    libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x00110000) 
    /lib/ld-linux.so.2 (0x00ea2000) 

내가 왜 liboos_system.sl 확실하지 않다 내가 바이너리를 실행하려고 할 때

는 출력 .1.45.0 SO가 없습니다. 나는 그것을 오늘 조금 더 일찍 성공적으로 만들었습니다. 아무도 설명 할 수 있을까요?

+0

구축 할 때, 추가 링커 라이브러리에 대한 컴파일러 플래그를 전달하는 것이 가능하지만, 프로그램을 실행하려고 할 때, 부스트 라이브러리 돈 '

이것은 나를 위해 일한 것입니다 링커 경로에 존재하지 않습니다. 라이브러리의 [링크 문제]의 가능한 복제본 (http://stackoverflow.com/questions/4568187/linking-problem-in-libraries) – birryree

+1

답변을 찾았습니다. LD_LIBRARY_PATH에 경로를 추가하고 내 보내야했습니다. 바이너리는 실행되지만 오류를보고합니다 (오류 시스템 : 9 : 잘못된 파일 설명자).나는이 질문을 반영하여 그것을 반영해야하거나, 새로운 질문을 할 것입니다 – skyeagle

답변

21

라이브러리를 찾을 수 없습니다.

라이브러리는 기본적으로 /lib, /usr/lib/etc/ld.so.conf으로 지정된 디렉토리에서 찾습니다.

일반적으로 패키지 관리자를 통해 설치 한 경우 부스트와 같은 시스템 라이브러리는 /usr/lib에 있지만 사실은 그렇지 않습니다.

시스템에있는 부스트 라이브러리는 어디에 있습니까? 너 혼자서 컴파일 했니? 어쨌든,

LD_LIBRARY_PATH="your/boost/directory" ./testfgci 

내가 패키지 관리자를 사용하여 부스트 라이브러리를 설치하도록 건의 할 것입니다 :이 경우는이 LD_LIBRARY_PATH 환경 변수를 사용하여 위치하고있는 디렉토리에 라이브러리를 찾기 위해 동적 링커를 말해야한다 , 이것은 당신의 삶을 훨씬 더 단순하게 만들 것입니다.

15

이전 버전이지만, ldconfig을 실행하여 ld 캐시를 다시 작성할 수 있습니다. 그렇게하면 LD_LIBRARY_PATH을 업데이트 할 필요가 없습니다.

+1

정말 고마워요! – expert

3

우분투 (및 데비안) 사용자를위한 메모를 추가하고 싶습니다. 이러한 시스템은 LD_LIBRARY_PATH을 지우는 보안 "기능"을 가지고 있습니다. 그것은 ~/.bashrc을 위해 작동 할

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

하지만 경로는이 특정 대화 형 쉘 단지 설정됩니다 /etc/environemnt 또는 ~/.profile 또는 ~/.bash_profile 중 하나에서

을 : 이 작동하지 않습니다. 즉, 예를 들어 make을 호출하면 emacs 또는 eclipse, 런처가 아닌 셸에서 emacs을 시작하지 않으면 작동하지 않습니다.

echo -e "\n/usr/local/boost_1_54_0/stage/lib" | sudo tee -a /etc/ld.so.conf 
sudo ldconfig