공유 라이브러리 로드 중 오류 발생: 내부 오류

공유 라이브러리 로드 중 오류 발생: 내부 오류

팔을 따라가기 위해 컴파일된 OpenCV를 크로스합니다.이 가이드, 그리고 이것을 만들었습니다샘플 프로그램.

처음 실행하면 다음과 같습니다.

./DisplayImage image.png

나는 가지고있다:

./DisplayImage: 공유 라이브러리 로드 오류:
libopencv_highgui.so.3.1: 공유 개체 파일을 열 수 없습니다. 해당 파일 또는 디렉터리가 없습니다.

그래서 도서관이 필요하다고 생각합니다 libopencv_highgui.so.3.1. 그래서 이 모든 라이브러리를 다음에 추가했습니다 /lib.

(1) libopencv_highgui.so
(2) libopencv_highgui.so.3.1
(3) libopencv_highgui.so.3.1.0

심볼릭 링크: (1) -> (2) -> (3)

하지만 지금은 다음과 같은 결과를 얻습니다.

./DisplayImage: 공유 라이브러리 로드 오류:
lib/libopencv_highgui.so.3.1: 내부 오류

file정보를 확인하기 위해 라이브러리와 실행 파일을 실행했는데 결과는 다음과 같습니다.

.../opencv/platforms/linux/my_build/lib$ file libopencv_highgui.so.3.1.0
libopencv_highgui.so.3.1.0: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=1107ba22b36437bedb37dbfe0250626c14759be9, not stripped

.../opencv_sample$ file DisplayImage
DisplayImage: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=aef57fe79d0928ca3afdff8d1b65268e1ad72e77, not stripped

편집하다:
실행하면 readelf -d DisplayImage | grep NEEDED다음이 생성됩니다.

 0x00000001 (NEEDED)                     Shared library: [libopencv_highgui.so.3.1]
 0x00000001 (NEEDED)                     Shared library: [libopencv_imgcodecs.so.3.1]
 0x00000001 (NEEDED)                     Shared library: [libopencv_core.so.3.1]
 0x00000001 (NEEDED)                     Shared library: [libstdc++.so.6]
 0x00000001 (NEEDED)                     Shared library: [libgcc_s.so.1]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x00000001 (NEEDED)                     Shared library: [ld-linux-armhf.so.3]

을 제외하고 모두 내 타겟에서 찾았습니다 ld-linux-armhf.so.3.

이 "내부 오류" 문제의 원인은 무엇입니까?

답변1

바이너리를 컴파일할 때 지원되는 라이브러리 버전을 얻을 수 있도록 버전 번호가 포함된 참조인 공유 라이브러리를 사용할 수 있습니다.

때로는 기호를 통해 최신 라이브러리를 이전 이름에 연결할 수 있으며 바이너리는 이 이름을 사용하려고 시도합니다.

그러나 이것이 바이너리가 해당 버전을 지원한다는 의미는 아닙니다. 일부 기능은 변경되었을 수 있으며, 일부 기능은 제거 또는 추가되었을 수 있습니다.

따라서 컴파일 시 비호환성이 표시되는 최신 라이브러리 버전에 대해 바이너리를 다시 컴파일하는 것이 좋습니다.

ldd를 사용하여 라이브러리 종속성을 볼 수 있습니다.

예;

$ ldd /bin/ls
    linux-vdso.so.1 (0x00007ffc65ff3000)
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f9033f91000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9033bf1000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f9033979000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9033771000)
    /lib64/ld-linux-x86-64.so.2 (0x0000558f25845000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9033551000)

편집: ps... 라이브러리에는 자체 종속성이 있으므로 라이브러리 간에 복사할 수는 없습니다. 크로스 컴파일 머신에서는 컴파일하려면 유사한 라이브러리 버전이 필요합니다.

관련 정보