共有ライブラリのロード中にエラーが発生しました:内部エラー

共有ライブラリのロード中にエラーが発生しました:内部エラー

腕に従うためにコンパイルされた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 ...ライブラリには独自の依存関係があるため、ライブラリ間でコピーすることはできません。クロスコンパイルマシンでは、コンパイルには同様のライブラリバージョンが必要です。

関連情報