레거시 라이브러리 버전이 필요한 소프트웨어를 실행하는 방법은 무엇입니까?


1

오래 된 OpenCV 버전 (2.4.9 이하)이 필요하고 최신 버전에서는 OpenCV가 부분적으로 C API에 대한 지원을 2.5로 낮추는 오래된 응용 프로그램이 있습니다. 이전에는 배포판을 더 이상 지원하지 않아서 정말 오래된 배포판과 블랙리스트 opencv 업데이트를 사용했지만 업데이트를해야했습니다. openCV의 현재 버전은 3.1입니다.

컨테이너를 사용할 수 있습니까? 나는이 도서관이 오래 되기만하면된다. 이전 OpenCV를 컴파일 할 수는 있지만 X 지원에 대해 조금 걱정이됩니다. 분명히 카메라를 사용하는 그래픽 응용 프로그램입니다. 아니면 더 나은 해결책이 있을까요?

답변:


2

OpenVZ를 대체 할 때의 문제는 많은 라이브러리 서로에 의존하다 (오래된 "DLL 지옥"문제). 일부 라이브러리는 OpenVZ에 의존하며 OpenVZ는 다른 라이브러리에 의존합니다.

몇 년이 걸릴지에 따라 오래된 라이브러리를 "응집력있는 하위 집합"으로 가져 와서 컨테이너를 사용하지 말고 LD_LIBRARY_PATH 환경 변수는 이전 libs에서 동적 로더를 가리 킵니다.

이것은 일반적으로 호스트 시스템 (/ lib 또는 / usr / lib)의 libstdc ++ 및 libc 버전이 ABI 호환 이전 버전의 OpenCV (및 종속성)를 컴파일하고 링크하는 데 사용 된 버전이 포함되어 있습니다. 불행히도 Linux 커널 ABI와는 달리 libc ABI가 가끔 바뀌며 libstdc ++ ABI가 비교적 자주 변경됩니다.

따라서 필요한 버전으로 OpenCV의 오래된 바이너리를 얻으려면 대략이 프로세스가 필요합니다.

  • 시험 다만 LD_LIBRARY_PATH 디렉토리에있는 오래된 OpenCV 라이브러리. 작동하지 않으면, 누락 된 라이브러리에 대한 오류가 발생합니다 (종속성이 올바르게 버전을 지정한다고 가정). 누락 된 라이브러리를 가져 와서 오래된 OpenCV와 같은 디렉토리에 넣으십시오. 누락 된 라이브러리 오류가 사라질 때까지 반복하십시오.
  • libstdc ++ 또는 libc에서 심볼 탐색 오류가 발생하거나 불량 glibc 버전에 대한 불만이 생기면 외륜없이 크릭이되고 가상화 및 이전 OS 버전 설치 이외의 유일한 솔루션은 다음과 같습니다. ...

플랫 팩

http://flatpak.org/ - 모든 의존 라이브러리를 포함하는 응용 프로그램 패키징 형식

컨테이너

컨테이너는 좋은 방법입니다. 좋은 LXC 및 LXD와 같은 컨테이너 솔루션은 게스트를 완전히 분리하고 게스트가 자체적으로 PID 1 (init 데몬). 기본적으로 리눅스에서 프로세스를 시작하려면, 동적 로더 (libdl)가 공유 라이브러리를로드 할 수 있어야하기 때문에, 이미 실행중인 작업과 시작중인 작업간에 호환이 이루어져야합니다. 그러나 컨테이너에는 완전히 분리 할 수있는 방법이 있으므로 동일한 호스트 커널에서 호환되지 않는 버전의 libc, libdl 및 libstdc ++를 사용할 수 있습니다.

이전 데비안 또는 CentOS / RHEL 호스트 시스템을 실행하는 경우 Ubuntu & gt; = 16.04 또는 OpenVZ를 실행하면 LXD를 권하고 싶습니다. 불행히도 LXD는 우분투가 아닌 다른 배포판에도 설치하기가 쉽지 않으며 OpenVZ는 최신 배포판을 지원하지 않습니다.

리눅스 커널에 대한 좋은 점은 (직접 렌더링 관리자와 같은) 드라이버 특정 인터페이스를 제외하고 리눅스 커널 ABI는 안정된 오랫동안. 그 의미는:

  • 오래된 "userspaces"(그 안에있는 것과는 반대로 커널에서 실행되는 모든 것)는 상당히 새로운 커널에서 작동해야합니다.
  • 새로운 사용자 공간은 꽤 오래된 구 커널에서 작동해야합니다.

실제로 이것이 의미하는 바는 컨테이너에 3D 그래픽 드라이버 또는 다른 종류의 특수 하드웨어를 사용하지 않는 한 컨테이너 시스템과 호스트 커널 간의 연령 차이에 관계없이 "그냥 작동"해야한다는 것입니다 (특정 2.6.9보다 오래된 Linux 커널 용으로 컴파일 된 소프트웨어는 일반적으로 최신 커널에서는 작동하지 않으며 2.6.0보다 오래되면 확실히 작동하지 않습니다.

예전 라이브러리를 사용하려면 오래된 라이브러리에 의존하는 오래된 라이브러리 (또는 오래된 라이브러리에 의존하는 바이너리)를 실행하려면 최소한의 노력이 필요합니다.

  • 최소 : 라이브러리의 이전 버전을 디렉토리에 놓고 LD_LIBRARY_PATH를 설정하면 완료됩니다.
  • Typical (많은 독점적 인 게임과 프로그램에서 사용됨) : 라이브러리의 이전 버전과 모든 의존성을 삭제하십시오. 를 제외하고 libc, LD_LIBRARY_PATH를 설정하면 끝난다.
  • 광범위한 라이브러리 교체 (버그가 있거나 작동하지 않을 수도 있음) : 라이브러리의 이전 버전 libstdc ++, libc, libdl 및 모든 종속성을 디렉토리에 놓고 LD_LIBRARY_PATH를 설정하면 완료됩니다.
  • 컨테이너 : 가상화를 실행하지 않고 호스트 커널 위에 다른 구형 OS에 대한 완전한 기본 시스템을 설치하십시오 (여전히 Linux 커널 복사본 하나만 실행하고 있음). 빠른 ,하지만 몇 기가 바이트 디스크 공간을 차지합니다. 매우 당신이 그것에 던질 수있는 무엇이든과 호환됩니다 (고대의 배포판 포함).
  • 가상 머신 : 게스트 OS 소프트웨어가 하드웨어가 실행되는 것과 동일한 CPU에서 실행되는 한 비 Linux OS에서도 가능하며 호환성은 문제가되지 않습니다.

흠. 나는 여전히 그 오래된 OpenCV와 그것을 컴파일하는데 필요한 모든 libs를 가진 하나의 머신을 가지고있다. 이전 OpenCV를 다른 라이브러리에 의존하지 않고 X 및 커널의 카메라 드라이버가 호환되는 한 호환 할 수 있습니까? (모든 의존성 포함)?
Lapsio

1
오, 네 - 당신도 할 수 있습니다. 엮다 OpenCV가 의존하는 lib가 호스트 시스템에서 너무 새로운 경우가 아니라면, 이론 상으로는 말입니다. 이것은 매우 구체적인 질문입니다. OpenCV 관리자가 아니라면 대답하기가 힘듭니다. 그래서 제안 해 주시면됩니다.
allquixotic

또한 플랫 팩이 있습니다! flatpak.org
allquixotic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.