찾다

 >  Q&A  >  본문

c++ - linux如何把一个二进制可执行文件依赖的库找出来并编译成另一个可执行文件呢?

这样把文件拷贝到其他地方就可以使用了

高洛峰高洛峰2825일 전736

모든 응답(3)나는 대답할 것이다

  • 大家讲道理

    大家讲道理2017-04-17 15:19:02

    우선 어떤 라이브러리에 의존하는지 알아야 합니다. ldd 도움이 될 수 있지만 너무 만족하지는 마세요. 일부 프로그램은 동적으로 로드된 라이브러리를 사용하는지 여부는 그렇지 않습니다. pass ldd 이 정적 분석 도구는 동적으로 로드된 라이브러리를 찾고 ldd을 반복적으로 호출해야 한다는 것을 알고 있습니다.

    그러나 종속성을 안다고 해서 문제가 해결되는 것은 아닙니다. 종속성 없이 실행 파일을 컴파일하고 다른 컴퓨터에서 직접 실행할 수 있기를 원할 것입니다. 이를 위해서는 静态链接을 사용하여 프로그램 소스 코드를 다시 컴파일해야 합니다. 동시에 종속 라이브러리는 .a 대신 라이브러리의 아카이브 버전(일반적으로 .so)도 제공해야 합니다. 많은 종속 라이브러리는 설치 중에 기본적으로 .a 버전의 라이브러리를 설치하지 않습니다. 소스 코드에서 일부 라이브러리를 컴파일하더라도 기본적으로 라이브러리의 아카이브 버전을 컴파일할 수 없습니다.

    한 가지 추가 사항: glibc를 실행 파일로 정적으로 컴파일하려는 경우에는 그렇게 하지 마십시오. glibc는 거의 모든 Linux 배포 시스템에 포함된 기본 라이브러리이며 일반적으로 프로그램에 정적으로 링크될 필요가 없으며 glibc는 이전 버전과 호환됩니다. 따라서 상대적으로 낮은 버전의 glibc에서만 컴파일하면 됩니다. 프로그램은 Linux 시스템에서 실행될 수 있습니다. C 를 사용하는 경우 stdlib도 고려해야 할 사항일 수 있습니다. glibc를 정적으로 만들려고 하면 몇 가지 알 수 없는 문제가 발생할 수 있습니다.

    회신하다
    0
  • 大家讲道理

    大家讲道理2017-04-17 15:19:02

    Linux의 ldd 명령은 실행 프로그램이 의존하는 라이브러리를 확인합니다

    으아악

    회신하다
    0
  • 大家讲道理

    大家讲道理2017-04-17 15:19:02

    동적 라이브러리만 패키징할 수 있습니다. 컴파일하려면 소스 코드를 링크할 때 정적 링크를 사용해야 합니다. .
    패키징할 때 기본 라이브러리 버전(예: glibc)에도 주의해야 합니다. 머신 환경이 동일하면 문제가 없습니다. 또한 실행 시 수동으로 설정해야 합니다. LD_LIBRARY_PATH 프로그램을 시작하세요. .
    위층 위층과 동일ldd프로그램에서 elf 사용하는 동적 라이브러리 링크의 방향을 볼 수 있습니다. .

    회신하다
    0
  • 취소회신하다