한 컴퓨터에서 컴파일된 프로그램을 다른 컴퓨터로 이동하여 라이브러리 종속성 문제 방지

한 컴퓨터에서 컴파일된 프로그램을 다른 컴퓨터로 이동하여 라이브러리 종속성 문제 방지

Windows에서 종속성이 있는 프로그램을 컴파일할 때 .dll필요한 프로그램이 포함된 해당 ddls를 다른 컴퓨터에 복사하고 해당 DLL을 프로그램 디렉터리에 넣습니다.

이제 내 문제는 다음과 같습니다. Ubuntu에서 clang 및 clang++를 사용하여 프로그램을 컴파일했는데, 컴파일된 프로그램을 내 서버(CentOS)로 전송할 때 누락된 라이브러리로 인해 프로그램이 로드되지 않습니다. 내 라이브러리를 내 컴퓨터에서 서버로 전송하고 싶지만 가능한지 모르겠습니다.

루트 비밀번호가 없어서 해당 서버에 프로그램을 설치할 수 없습니다. 이 문제를 해결할 수 있는 방법이 있나요?

답변1

파일을 시스템 전체 디렉토리에 임의로 .so복사하는 것은 패키지 시스템 제어를 인식하지 못한 채 공유 라이브러리를 대상 시스템에 복사하여 잠재적으로 설치된 소프트웨어와 충돌을 일으킬 수 있으므로 좋은 습관이 아닙니다. 수동으로 쉽게 매핑됩니다.

마일리지는 다를 수 있지만 찾을 수 있는 세 가지 방법이 있습니다.

첫 번째는 대상 배포판에 호환되는 라이브러리 버전이 포함된 필수 패키지를 설치하는 것입니다. 그러나 루트가 필요하지만 귀하가 표시한 것은 옵션이 아닙니다. 어쨌든 이것이 어느 시점에서 옵션이 된다면 이 접근 방식에 도움이 되는 몇 가지 팁은 다음과 같습니다. ldd you_executable_file특정 프로그램에 대한 라이브러리 종속성을 표시합니다. 그러한 라이브러리를 제공하는 배포판에서 패키지를 찾을 수 있습니다(예를 들어 Fedora에서는 yum provides path_to_required_file설치해야 할 패키지를 알려주는 데 사용할 수 있습니다 ).

두 번째는 배포에 구애받지 않는 실행 파일을 생성하는 것입니다. 이렇게 하려면 소프트웨어를 컴파일할 때 정적 라이브러리를 사용해야 합니다. 일반적으로 Linux에서는 대부분의 라이브러리의 공유(.so) 및 정적(.a) 버전을 찾을 수 있습니다. 정적 버전을 사용하고 마치 객체 파일(.o)인 것처럼 링크해야 합니다. 단점은 결과 바이너리가 공유 라이브러리를 사용할 때보다 훨씬 크다는 것입니다. 왜냐하면 그 내부에 모든 라이브러리 코드가 포함되기 때문입니다. 또한 나중에 시스템에 설치되는 라이브러리의 버그 수정에 민감하지 않습니다(새 수정 버전으로 프로그램을 다시 컴파일해야 함).

세 번째 옵션은 실제로 라이브러리를 새 시스템(루트가 아니더라도)의 홈 디렉터리 아래 디렉터리에 복사하고 LD_LIBRARY_PATH및/또는 LD_PRELOAD환경 변수를 사용하여 동적 링커가 라이브러리 복사본을 사용하도록 하는 것입니다. 많은 라이브러리를 복사해야 할 수도 있습니다( ldd위에서 언급한 명령을 사용하여 검색할 수 있음). LD_LIBRARY_PATH누락된 라이브러리에 대한 다른 경로를 찾도록 동적 링커에 지시합니다. LD_PRELOAD동적 링커가 특정 버전의 라이브러리를 미리 로드하도록 강제하여 시스템 전체 버전을 재정의합니다.

관련 정보