Я кросс-компилировал 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
Когда двоичный файл скомпилирован, он может использовать общие библиотеки. Эти библиотеки являются ссылками с номером версии, чтобы вы могли получить поддерживаемую версию библиотеки.
иногда можно обойтись sym-линковкой новой библиотеки со старым именем, двоичный файл попытается использовать это имя.
Однако это не означает, что двоичный файл будет поддерживать эту версию. Некоторые функции могли измениться, некоторые функции могли быть удалены или добавлены и т. д.
Поэтому я бы рекомендовал перекомпилировать двоичный файл с использованием более новой версии библиотеки, так как несовместимости будут выявлены во время компиляции.
Вы можете просмотреть зависимости библиотек с помощью 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... вы не можете просто скопировать между библиотеками, так как у них есть свои собственные зависимости. Вашей кросс-компилирующей машине понадобятся похожие версии библиотек для компиляции.