Linux용 C++ 라이브러리를 출시하고 싶습니다. (다른 라이브러리가 동적으로 링크되지 않은 경우) 다른 Linux 배포판과의 호환성을 결정하는 것은 glibc 버전뿐입니다.
여러 가상 머신을 설정하고 컴파일하는 것보다 지난 5년 동안 대부분의 Linux 배포판을 지원하는 더 좋은 방법이 있습니까? 예를 들어, 매우 오래된 Linux 시스템에서 컴파일된 Linux 바이너리가 새 Linux 버전에서 실행됩니까?
답변1
Linux 커널 API는 매우 안정적입니다. (커널 내 API가 아닌 시스템 호출에 대해 이야기하고 있습니다.) 1997년경부터 생성된 정적 링크 실행 파일(전환매우 낮은 주파수실행 가능한 형식으로)는 현재 모든 Linux 시스템에서 작동해야 합니다. 그러나 정적으로 링크된 실행 파일에는 여러 가지 단점이 있습니다. 부피가 크고, 타사 코드에서 버그가 발견되면 쉽게 업그레이드할 수 없으며, 특정 시스템 기능과 상호 작용할 때 문제가 발생하기 때문에 자체 버블에 존재하는 경향이 있습니다. 표준 라이브러리는 이에 대한 구성 가능한 지원을 제공합니다(예: DNS, 로케일, 사용자 계정...).
라이브러리의 경우 일반적인 규칙은 버전의 첫 번째 숫자에 대한 변경 사항이 호환되지 않는 ABI 변경 사항을 나타내고 버전의 나머지 부분은 이전 버전과 호환되는 변경 사항에 따라 증가한다는 것입니다. 예를 들어, 프로그램이 버전 2.3에 연결되면 라이브러리 버전 2.3 또는 2.4에서는 작동하지만 2.2 또는 3에서는 작동하지 않습니다. 일부 라이브러리는 다른 규칙을 사용합니다. 동적 링커 사용법소남버전이 적절한지 확인하기 위해 라이브러리에 기록됩니다.
비임베디드 Linux의 표준 라이브러리는 다음과 같습니다.glibc. 1998년경부터 Linux에서 Glibc의 주요 버전은 6입니다(따라서 libc6이라는 이름). 업스트림 주요 버전은 2입니다. 이는 libc6이 버전 2인 이유를 설명합니다.미성년자6 대신.미성년자. 원칙적으로 이전 버전의 libc6과 연결된 프로그램은 최신 버전에서도 작동해야 하지만 초기에는 항상 그런 것은 아니었습니다. Glibc 2.3 이상과 연결된 모든 프로그램은 현재 버전에서 실행되어야 합니다.
표준 C++ 라이브러리는 과거에 더 빠르게 변경되었지만 현재 주요 버전(6)은 2005년경부터 출시되었습니다.
이전 시스템에서 프로그램을 컴파일하는 경우 필요한 라이브러리 버전을 사용할 수 있다면 최신 시스템에서 실행되어야 합니다. 가져가다지원되는 가장 오래된 버전의 CentOS(현재 5) 그리고가장 오래된 [오래된] 안정적인 데비안 릴리스(현재는 스퀴즈가 여전히 자격이 있을 수 있지만) 두 가지 모두에서 실행되는 바이너리를 빌드하면 모든 Linux 설치에서 작동할 수 있습니다(보안 업데이트를 더 이상 사용할 수 없는 시스템 버전인 임베디드 시스템 및 런타임 사용되지 않는 시스템 제외).
답변2
예, 대부분의 경우 새로운 커널 기능을 피해야 할 수도 있습니다.
이식 가능한 C++ 프로그램을 만들려면 공식 ISO C++ 표준을 따르는 것이 좋습니다. 표준이 변경됨에 따라 절차를 조정해야 할 수도 있지만 일반적으로 이는 많은 작업이 아닙니다.
프로그램이 오래된 라이브러리가 있는 컴퓨터에서 컴파일되지 않는 것을 피하기 위해 g++에 이전 표준을 따르도록 요청할 수 있습니다. 컴파일러 정의는 다음과 같습니다
-D__STRICT_ANSI__ -D_ISOC99_SOURCE=1 -D_ISOC9X_SOURCE=1
(C의 경우).
물론 하드웨어 문제도 있습니다(대상 CPU에는 IA64와 같은 아키텍처, SSE와 같은 CPU 기능이 포함됨).