2011-11-10 3 views
2

내 응용 프로그램은 호스트 A (OS : Ubuntu 11.04)에서 libboost_python (버전 : 1.46.1)을 연결합니다. 이 라이브러리는 소스에서 내장되어 다음과 같이 그 정보는 : 나는 호스트 B에 내 응용 프로그램 (OS : 우분투 11.10)을 실행하면공유 객체 이름이 충돌합니다

lrwxrwxrwx 1 henry henry  25 2011-11-10 14:33 libboost_python.so -> libboost_python.so.1.46.1 
-rwxr-xr-x 1 henry henry 379867 2011-11-10 14:33 libboost_python.so.1.46.1 

, 내가 APT와 같은 버전으로 libboost_python 설치합니다. 그 정보는 약간 다릅니다 :

lrwxrwxrwx 1 root root  30 2011-06-03 14:54 /usr/lib/libboost_python-py27.so -> libboost_python-py27.so.1.46.1 
-rw-r--r-- 1 root root 291224 2011-06-03 14:54 /usr/lib/libboost_python-py27.so.1.46.1 
lrwxrwxrwx 1 root root  23 2011-11-09 04:34 /usr/lib/libboost_python.so -> libboost_python-py27.so 

libboost_python.so에 의해 연결된 최종 목표는 (호스트 B는 'py27을'이) 다르다. 따라서 앱을 실행하면 오류가 발생합니다.

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

이 충돌 이름을 어떻게 수정할 수 있습니까? 내가 cmd를 'readelf -d의 MyApp를'실행 출력 :

0x00000001 (NEEDED)      Shared library: [libboost_python.so.1.46.1] 
0x00000001 (NEEDED)      Shared library: [libboost_system.so.1.46.1] 
0x00000001 (NEEDED)      Shared library: [libpython2.7.so.1.0] 
0x00000001 (NEEDED)      Shared library: [libjuserclass.so.0] 
0x00000001 (NEEDED)      Shared library: [libstdc++.so.6] 

호기심 것은 부스트에 대한 항목이 너무 이름 만 lib 디렉토리의 전체 이름을 저장하지 않습니다.

+0

자세히 알아 보려면 질문에 대한 답을 받아 들여야합니다. 답변을 답이 아닌 질문으로 표시하지 않으며 답변을 돌보는 사람들에게 예의를 보입니다. – thiton

답변

0

여기에는 두 가지 옵션이 있습니다. 하나는 새 명명 체계에 맞게 다시 컴파일하고 더티는 더 오래 된 라이브러리에 대한 링크 표현입니다.

우분투 관리자 (및 업스트림)는 python 버전을 boost_python 라이브러리 버전에 포함시키는 것이 현명한 방법이라고 생각했습니다. libboost_python의 오른쪽 파이썬 버전과 링크해야합니다. "libboost_python-py27.so.1.46.1"이라는 이름이 그 것을 확인합니다. 당신은 당신의 devel 머신에서 파이썬 2.6에 링크했을 수도 있고 당신의 프로그램이 추락 할 때까지 결코 깨닫지 못할 수도 있습니다. Ubuntu 11.10과 함께 제공되는 새로운 버전의 libboost-python1.46-dev 패키지와 프로그램을 다시 링크해야합니다. devel 컴퓨터를 최신 Ubuntu로 완전히 업그레이드하거나 libboost-python1.46-dev의 새 버전을 선택적으로 제거하십시오.

더러운 수정

조금 빠르다 :

[email protected]> sudo ln -s libboost_python-py27.so.1.46.1 libboost_python.so.1.46.1 

편집 : 링크 된 실행 파일에 표시 할 라이브러리의 버전 이름을 완벽하게 권리입니다. 그 이유는 간단합니다. 시스템에 여러 버전의 libboost를 설치하여 일부 프로그램을 링크 할 수 있습니다. 1.46.1 및 일부는 1.47.1과 비교된다. .so 파일의 버전이없는 이름은 컴파일 단계의 링커 용이며 설치된 부스트 헤더와 동일한 버전에 연결됩니다. 컴파일 한 후에는 버전이있는 .so 만 필요합니다.

+0

감사합니다. 나는 위에서 말한 것처럼 이름에 관해 다른 질문을 가지고있다. 왜 그런지 알아? – yelo

관련 문제