2014-02-26 4 views
1

내 프로젝트에서 이미 컴파일되고 생성 된 두 개의 라이브러리를 사용하려고합니다. 우리는 liba.so (우리 자신의 라이브러리가 언젠가 다시 만들어 짐)와 libssl.so.10 (이것은 Linux에서 사용 가능합니다)이라고합시다.여러 버전의 라이브러리가 Linux에 포함되어 발생하는 버전 충돌을 해결하는 방법

이제 liba.so 데 의존 libcurl.so.3 & libssl.so.10 의존성 libcurl.so.4 (최신)

libcurl.so.3 및 libcurl.so.4 모두를 가지고있다 시스템에서 사용할 수 있습니다.

따라서 프로젝트에서 두 가지를 모두 사용하려고하면 버전 충돌이 발생합니다. 기대 되는가? 그렇다면 어떻게이 문제를 해결할 수 있습니까?

이 라이브러리를 다시 빌드하지 않고 최신 libcurl.so.4에서 liba.so 종속성을 수정할 수있는 방법이 있습니까? 아니면 최신 libcurl.so.4로 liba.so를 다시 빌드해야합니까? 당신의 도움이

답변

1

에 대한

덕분에 따라서 내가 버전 충돌을 얻고 내 프로젝트에서 둘 다 사용하려고하면. 기대 되는가? 그렇다면 어떻게이 문제를 해결할 수 있습니까?

두 가지 해결책이 있습니다.

먼저 libcurl.so & libssl.so 버전을 사용하고 싶습니다. 그런 다음 링커의 rpath 또는 LD_LIBRARY_PATH을 사용하여 포함 된 공유 객체를로드 할 수 있습니다.

두 번째로 liba.so을 빌드하면 libcurllibssl에 정적으로 연결됩니다.

Android에서 작업하는 경우 숫자 2를 선택하십시오. OpenSSL이 안드로이드에 포함되어 있기 때문에, zygote가 그것을로드하고, 당신은 항상 zygote에서 포크 다음으로 하위 버전 0.9.8을 얻습니다.

안드로이드에서 원했던 모든 것이 현대적인 OpenSSL 1.0.1 (libcurl.so.3libcurl.so.4과 많이 닮았습니다)과 같은 것이라면 래퍼 공유 객체를 빌드해야 할 필요가 있습니다.

+0

첫 번째 솔루션에서 동일한 라이브러리에 두 라이브러리 (libcurl.so.3 및 libcurl.so.4)가 있습니다. 따라서 rpath 또는 LD_LIBRARY_PATH에 디렉토리 위치를 지정하면 기본적으로 충돌로 끝납니다. 그렇다면 명시 적으로 버전을 지정해야한다고 말하는 것입니까? 두 번째 해결 방안으로 이전 libcurl.so.3과 liba.so를 정적으로 링크하고 libcll.so.4를 동적으로 libssl.so.10과 함께 사용할 수 있습니까? – Jegan

+0

귀하의 정보를 위해서, 이것은 Android가 아닙니다. 이것은 RedHat 개발 서버입니다. – Jegan

+0

libcurl.so.3과 libcurl.so.4는 아마도 이진 호환이되지 않습니다 (따라서 버전 범프의 이유). 동일한 버전에 대해 모든 것을 컴파일해야하거나 호환되지 않는 ABI로 문제를 제거하기 위해 정적 링크를 수행해야합니다. 동적 링커가 libcurl.so.3을 먼저로드하면 libcurl.so.4가 종속됩니다 (반대의 경우도 마찬가지 임). – jww