2014-01-09 3 views
6

내 컴퓨터에 내 프로그램을 구축 중입니다 (libtiff.so -> libtiff.so.5). 그런 다음 libtiff.so -> libtiff.so.4 인 다른 컴퓨터에서 빌드를 푸시하십시오.공유 라이브러리의 이전 버전에 링크하는 방법

런타임에 내 프로그램이 존재합니다 :«공유 라이브러리를로드하는 중 오류가 발생했습니다 : libtiff.so.5 : 공유 오브젝트 파일을 열 수 없습니다 : 해당 파일 또는 디렉토리 없음».

다른 컴퓨터를 업그레이드 할 수 없어 실행중인 컴퓨터와 동일한 버전의 가상 컴퓨터에서 컴파일하지 않는 것이 좋습니다. 따라서 컴파일러에서 libtiff.so.5 대신 libtiff.so.4을 사용하도록하고 싶습니다.

내 컴퓨터에 이 설치되어 있습니다 (주소는 libtiff.so.5). 최신 버전 대신이 버전과 어떻게 연동 할 수 있습니까? 나는 libtiff.so -> libtiff.so.4을 움직일 생각을했지만, 최신 버전이 필요하다면 내 시스템을 망가뜨릴 까봐 두렵다. (apt-get purge libtiff5은 다른 패키지가 필요하기 때문에 오류가 난다.)

라이브러리의 이전 버전과 링크 할 수 있습니까? 그렇다면 어떻게? libtiff.so의 심볼 링크를 이전 버전으로 변경하는 것이 유해합니까? 그렇지 않다면 문제가 해결 될까요?

+0

아마도 [LD_PRELOAD] (http://en.wikipedia.org/wiki/Dynamic_linker)를 사용하면됩니다. – jml

+0

링크 할 때 일반적인'-ltiff' 대신 .so.4에 전체 경로를 사용하는 것은 어떻습니까? (libtiff4 호환 헤더를 컴파일 할 필요가 있습니다.) –

+0

컴파일러가 공유 라이브러리의 위치를 ​​찾을 수 없습니다. 나는 PATH도 통과해야한다고 생각합니다. –

답변

2

당신은 라이브러리의 특정 버전에 연결이 구문을 사용할 수 있습니다 : 당신은 경로를 지정할 필요가 없습니다

 
gcc [other options] -l:libtiff.so.4 

; 라이브러리를 찾으려면 일반적인 디렉토리가 검색됩니다.

참고 : Michael Wild이 언급했듯이 최신 버전 대신 해당 버전의 헤더 파일을 설치해야합니다.

+0

이 기능이 문서화 된 곳을 지적 할 수 있습니까? 어떻게 든'gcc' 문서에서 찾지 못했습니다. – cmaster

+0

@cmaster 링커 ('man ld')에 설명되어 있습니다. '-l' 옵션을 찾는다. –

+0

아, 찾았습니다. 감사. – cmaster

0

-ltiff 대신 .so :의 전체 경로를 링커에 전달하십시오 (/lib64/libtiff.so.4).

1

다른 사람이 언급했듯이 전체 버전이 지정된 이름이나 절대 경로를 지정하여 링커를 강제로 지정할 수 있습니다.

그러나 이렇게 할 것을 강력히 권고합니다. 문제는 설치된 헤더가 최신 버전의 라이브러리와 일치한다는 것입니다. 이러한 라이브러리 버전간에 API/ABI가 변경되면 프로그램이 작동하거나 간헐적으로 중단되거나 운이 좋으면 전혀 작동하지 않을 수 있습니다.

대신 libtiff.so.4 라이브러리에 해당하는 개발 패키지를 임시로 설치해야합니다. 데비안/우분투 또는 비슷한 경우, 이것은 libtiff4-dev 패키지입니다.

관련 문제