2010-01-26 3 views
2

제 리눅스 컴퓨터 (Ubuntu Karmic)에서 완벽하게 실행되는 C++ 코드가 있습니다. 다른 버전에서 실행하려고하면 모든 종류의 공유 ​​라이브러리가 없습니다.다른 리눅스 배포판에서 C++ 실행 파일과 관련된 문제가 발생했습니다.

모든 공유 라이브러리를 단일 실행 파일로 병합 할 수있는 방법이 있습니까?

편집 : 잘못된 질문을 한 것 같습니다. 이미 구축 된 실행 파일을 정적 링크하는 방법을 요청해야합니다. 내가 ermine & statifier

답변

6

이 당신이 라이브러리가 누락 공유 한 3 가지 이유입니다 :

  • 당신이 다른 배포판에 기본적으로 존재하지 않는 공유 라이브러리를 사용하고는, 또는 당신은 당신의 호스트를 설치했지만 다른되지 하나, 예. libDBI.so
  • 링크 시간에 버전을 과도하게 지정했습니다 (예 : libz.so.1.2.3 다른 기계는 호환되지 않는 것을 의미 라이브러리의 주요 버전이 변경이
  • 를 연결 할 경우에만 아마도 프로그램과 함께 일하는 것이 호환 API (주 버전 1)하지만 약간 다른 버전 2.3을 가지고 libc.so.2 vs libc.so.1

수정 프로그램은 다음과 같습니다

  • 수동하거나, 다른 컴퓨터에서 추가 라이브러리를 설치하거나 할, 즉 다른 배포판에있을 수 없습니다 필요하지 않거나 라이브러리를 연결하지 않습니다 (예 : RPM 사용)
  • 명령 줄에 버전을 너무 자세히 지정하지 마십시오. libz.so.1.2.3 대신 libz.so.1 링크를 사용하십시오.
  • 다른 libc 버전에 대해 여러 버전을 컴파일하십시오.
4

에서 답을 찾을 당신이 묘사하는 것은 정적 라이브러리 대신 공유 라이브러리를 사용하는 것입니다.

+0

라이브러리를 먼저 정적으로 컴파일해야합니다! – Alex

+2

시스템 라이브러리는 종종 정적 버전으로 제공됩니다. 그러나 동적 링크 라이브러리의 한 기능은 다른 커널 버전이나 다른 하드웨어와의 호환성을 보장하기위한 것이므로 여기에는 문제가 있습니다. 이 경우 정적 링크를 사용하면 동적 링크가 적절한 호환 버전을 선택하는 프로그램에서 오류가 발생할 수 있습니다. 또한 매우 적은 수의 라이브러리가 정적으로 링크 될 수 있다는 점에 유의하십시오. 귀하의 프로그램이 GPL 라이센스를받을 준비가되어 있지 않는 한, 귀하의 이익과 코드 비밀을 스스로 지키지 않는 한 괜찮습니다. –

+0

@windfinder, 사실이지만, 유일한 방법 인 공유 라이브러리에 대한 의존성을 없애고 싶다면. 의존성을 현명하게 처리하려고 시도하는 다른 솔루션이 있지만, 모든 것을 단일 실행 파일로 병합하는 방법에 대해 sagie는 질문했습니다. – Trent

1

너무 확신하지는 않지만 모든 라이브러리를 정적으로 링크하여 실행 파일을 만들 수 있습니다.

1

하나의 대안은 dlopen()를 사용하여 dynamically load 공유 라이브러리이며 종속 라이브러리가 일을 실행에 필요한 메시지와 함께 정상적으로 종료를로드 할 수없는 경우.
사용자는 적절한 라이브러리를 설치할 수 있습니다.

2

여기에 언급 된 원래의 문제에 대한 몇 가지 기술적 해결책이있었습니다.

다른 libc 버전에 대해 여러 버전을 컴파일하십시오.

또는

다른 기계

하지만 당신은 ISV의 위치에 있다면, 하나의 온건 한 해결책은 정말 거기에 추가 라이브러리를 설치 :

이전 시스템을 새로 설치하십시오 (예 : 데스크톱을 대상으로하는 경우 우분투 6.x, 서버를 대상으로하는 경우 Red Hat 9까지). 그것에 소프트웨어. 일반적으로 라이브러리 (및 확실히 libc)는 하위 호환성이 있으므로 최신 시스템에서 실행하는 데 문제가 없습니다.

물론 비표준 버전이나 최신 버전의 lib 의존성이있는 경우에도 문제가 완전히 해결되지는 않습니다. 이 경우에 다른 사람들이 제안한 것처럼 강력하고 싶다면 dlopen()하고 문제점을보고하거나 기능이 축소 된 상태로 실행하는 것이 좋습니다.

1

다른 가능한 해결책은 statifier (http://statifier.sf.net) 또는 Ermine (http://magicErmine.com) 을 사용하는 것입니다. 둘 다 동적 실행 파일을 사용할 수 있으며 모든 라이브러리는 하나의 자체 포함하는 실행 파일