왜 `ldd인가?` 출력 "??? => ???" (라이브러리와 위치 모두 물음표가 있음)?

왜 `ldd인가?` 출력 "??? => ???" (라이브러리와 위치 모두 물음표가 있음)?

을( 를) 실행하는 동안 검색 엔진을 통해 "Linux", " " 및 " " 의 다양한 조합을 검색하면 이 웹 사이트에 ldd <dynamic_lib>로 표시되는 항목이 몇 개 있는 것을 발견했습니다 .??? => ???ldd??? => ???

관련 가능성이 있음: 문제의 동적 라이브러리는 내장된 GCC 제품군을 사용하여 Windows 10의 MSYS2에서 컴파일되었습니다.

답변1

ldd명령은 실행/사용할 때와 마찬가지로 실행 파일이나 라이브러리를 시스템의 공유 라이브러리에 연결하려고 시도합니다. 주어진 파일에서 라이브러리 참조를 읽고 파일 시스템과 path() 에서 찾으려고 시도합니다 LD_LIBRARY_PATH. " "라고 표시되면 ???시스템에서 일부 라이브러리를 찾을 수 없다는 의미입니다(그리고 확인한 프로그램/라이브러리가 실행되지 않거나 사용 가능하지 않을 수 있음).

라이브러리 문제는 일반적으로 한 시스템에서 다른 시스템으로 파일(실행 파일 또는 공유 개체 라이브러리)을 복사할 때 발생합니다. 그 이유는 시스템 라이브러리가 다르기 때문입니다. 비록 이러한 라이브러리가 다른 버전으로 인해 존재하더라도 말입니다.

때때로 해결책은 누락된 라이브러리를 복사하여 에 넣는 것입니다 LD_LIBRARY_PATH. 복사된 라이브러리 파일을 시스템에 설치하고 싶지 않기 때문에 이 목적으로 해당 변수를 설정하거나 새 폴더를 추가할 수도 있습니다(!).

ldd원본 시스템에서 실행하여 복사할 라이브러리를 찾을 수 있습니다.

이것이 자신의 프로그램이거나 직접 컴파일한 경우 실제로 어떤 라이브러리가 누락되었는지 알 수 있습니다.

라이브러리를 식별한 후에는 개인 폴더에 복사할 수 있습니다(예: 에 복사) ~/libs. 그런 다음 이 폴더를 라이브러리 경로에 추가합니다.

export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}":~/libs

변수가 이미 존재하는 경우(테스트 통과 echo $LD_LIBRARY_PATH), 또는

export LD_LIBRARY_PATH=~/libs

그렇지 않은 경우( bash쉘 구문의 두 가지 유형).

그런 다음 ldd다시 시도해 보세요.

나중에 변수를 설정한 다음 프로그램을 시작하는 쉘 스크립트를 사용하여 언제든지 실제 프로그램을 시작할 수 있습니다.

답변2

Windows의 MSYS2에서 동일한 문제가 있는 경우(GCC Suite를 사용하여 공유 라이브러리를 컴파일하고 라이브러리에 실행 파일을 연결한 다음 런타임 시 종속성이 누락되었음을 발견) 다음을 수행할 수 있습니다.

  1. 공유 라이브러리를 실행 파일과 동일한 디렉터리에 복사합니다.
  2. 실행 파일과 동일한 디렉터리에서 공유 라이브러리에 연결합니다.
  3. 공유 라이브러리가 포함된 디렉터리를 포함하도록 PATH 환경 변수를 수정합니다.

MSYS2는 Windows에서 Unix와 유사한 환경을 제공할 수 있지만 여전히 Windows가 런타임에 실행 파일(공유 라이브러리 포함)을 검색하는 방식을 따라야 합니다(간단히 말하면 LD_LIBRARY_PATH는 의미가 없으며 링커는 제공된 경로에 신경 쓰지 않습니다). rpath를 사용하십시오;

관련 정보