동일한 라이브러리의 여러 포크를 사용하여 서로 다른 버전의 라이브러리가 필요한 여러 소프트웨어를 만드는 것이 가능합니까?

동일한 라이브러리의 여러 포크를 사용하여 서로 다른 버전의 라이브러리가 필요한 여러 소프트웨어를 만드는 것이 가능합니까?

Linux에서 라이브러리의 여러 인스턴스를 가질 수 있는지 알고 싶습니다.

예:

  • 소프트웨어 A가 작동하려면 라이브러리 X 이하의 1.0, 1.1 또는 1.2 분기가 필요합니다.
  • 소프트웨어 B가 작동하려면 라이브러리 X의 1.4 분기 또는 최신 1.x가 필요합니다.
  • 소프트웨어 C가 작동하려면 라이브러리 X의 2.0 분기 이상이 필요합니다.

세 가지 소프트웨어가 모두 올바르게 작동하도록 Library X 1.2, 1.8 및 2.3을 설치할 수 있습니까?

답변1

단일 라이브러리의 여러 버전을 설치할 수 있습니까?

물론! *nix에서 패키지 관리를 하면 실제로 이 작업이 매우 쉽습니다. 필요한 유일한 것은 패키지가 충돌하지 않는다는 것입니다(즉, 패키저가 몇 가지 트릭을 수행해야 할 수도 있음을 의미합니다). 그러나 실제 질문에는 더 심층적인 답변이 필요합니다.

이와 같이 여러 버전의 라이브러리를 설치하면 다양한 버전의 소프트웨어를 사용할 수 있습니까?

아마도. 이는 각 소프트웨어가 필수 라이브러리에 어떻게 연결되는지에 따라 다릅니다. 예를 들어 를 보면 /usr/lib대부분의 라이브러리에는 이 디렉토리에 최소한 두 개의 서로 다른 파일이 있다는 것을 알 수 있습니다( libname.so여기서 은 숫자 libname.so.#.#.#입니다 ). 이는 일반적으로 두 번째 파일에 대한 심볼릭 링크라는 #것을 알 수 있습니다 . libname.so일반적으로 이는 소프트웨어가 특정 버전의 라이브러리 또는 버전이 지정되지 않은 라이브러리의 모든 버전(일반적으로 최신 버전)에 대해 링크하도록 선택할 수 있기 때문입니다.

이제 각 소프트웨어에 사용된 라이브러리 버전에 대한 특정 요구 사항이 있는 경우 버전이 지정되지 않은 라이브러리가 원하는 버전이기를 바라는 대신 필요한 버전을 선택할 수 있습니다. 이런 경우라면 아마도 집으로 돌아가서 해야 할 일은 다른 라이브러리 버전을 올바르게 설치하는 것뿐입니다. 그러나 이러한 소프트웨어 중 하나가 버전이 지정되지 않은 링크에 연결되어 있지만 해당 링크가 라이브러리의 특정 버전일 것으로 예상하는 경우 버전이 지정되지 않은 링크가 예상한 버전이 아니면 작동하지 않습니다.

예를 들어 설명하겠습니다. Arch Linux에서는 두 가지 버전( 및 ) libpng이 공식적으로 패키지되어 있습니다 . 우연히 둘 다 설치해 봤습니다.1.21.6

$ ls -l /usr/lib | grep png
lrwxrwxrwx  1 root root    18 Mar 12 08:05 libpng12.so -> libpng12.so.0.51.0*
lrwxrwxrwx  1 root root    18 Mar 12 08:05 libpng12.so.0 -> libpng12.so.0.51.0*
-rwxr-xr-x  1 root root  168K Mar 12 08:05 libpng12.so.0.51.0*
lrwxrwxrwx  1 root root    19 Jun 27 19:53 libpng16.so -> libpng16.so.16.12.0*
lrwxrwxrwx  1 root root    19 Jun 27 19:53 libpng16.so.16 -> libpng16.so.16.12.0*
-rwxr-xr-x  1 root root  216K Jun 27 19:53 libpng16.so.16.12.0*
lrwxrwxrwx  1 root root    11 Jun 27 19:53 libpng.so -> libpng16.so*

이제 이 파일 세트를 보면 libpng.so(완전히 버전이 지정되지 않은 링크)가 를 가리키는 libpng16.so(soname이 없는 버전이 지정된 링크)를 가리키는 것을 알 수 있습니다 libpng.so.16.12.0. libpng.so에 연결됩니다 libpng.so.16.12.0. 소프트웨어가 기대하는 바가 이것이기를 바랍니다. 그러나 소프트웨어에 실제로 해당 버전이 필요한 경우 1.2문제가 발생합니다 .

여기서 중요한 점은 소프트웨어를 패키징하는 경우 하드 라이브러리 버전 요구 사항이 무엇인지 파악하고 컴파일 단계에서 올바른 버전에 연결되는지 확인한다는 것입니다. 당신이 개발자라면 링크하는 모든 라이브러리의 최신 버전으로 소프트웨어를 최신 상태로 유지해야 한다는 교훈을 얻을 수 있습니다(그래서 직접 링크할 수 있으면 libname.so괜찮을 것입니다). 또는 무엇을 의존하는지 파악해야 합니다. on 이며 이를 지원하는 라이브러리 버전에 대해서만 링크하면 됩니다.

관련 정보