私はOpenCVをarm用にクロスコンパイルしました。このガイド、そしてこれを作ったサンプルプログラム。
最初にこれを実行したときは、次のようになりました。
./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... ライブラリには独自の依存関係があるため、単にライブラリ間でコピーすることはできません。クロスコンパイル マシンでは、コンパイルするために同様のライブラリ バージョンが必要になります。