Я пытаюсь интегрировать OpenCV (v4.1.2) в существующий проект, и я внес следующие изменения:
CMakeLists.txt
find_package(OpenCV REQUIRED core imgcodecs imgproc PATHS <path to all opencv shared object files>)
target_link_libraries(<exec name> ${OpenCV_LIBS})
Также добавлено ниже в файл конфигурации:
# cmakedefine HAVE_LIBOPENCV 1
# cmakedefine HAVE_OPENCV_H 1
Скопировать исполняемый файл вывода at:
/ usr / bin
Запустите приведенную ниже команду для установки rpath:
patchelf --set-rpath path-to -opencv / opencv / lib: $ ORIGIN / usr / bin / executetablename
Ниже приведены изменения, которые я добавил в исходный код:
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
cv::Mat img = cv::imread("sample.jpg", ZM_MAX_IMAGE_COLOURS);
cv::imwrite("sample-opencv.jpg", img);
Однако, когда я запускаю код, я вижу ниже сообщение в журналах:
error while loading shared libraries: libopencv_imgproc.so.4.1: cannot open shared object file: No such file or directory
Ниже приведены некоторые проверки работоспособности, которые я выполнил для исполняемого файла:
$readelf -d <executable name>
0x0000000000000001 (NEEDED) Shared library: [libopencv_imgcodecs.so.4.1]
0x0000000000000001 (NEEDED) Shared library: [libopencv_core.so.4.1]
0x000000000000001d (RUNPATH) Library runpath: [<path to opencv>/opencv/lib:]
$ ldd <executable name>
libopencv_imgcodecs.so.4.1 => <path to opencv>/opencv/lib/libopencv_imgcodecs.so.4.1 (0x00007f49cf6f9000)
libopencv_core.so.4.1 => <path to opencv>/opencv/lib/libopencv_core.so.4.1 (0x00007f49ce4fc000)
libopencv_imgproc.so.4.1 => <path to opencv>/opencv/lib/libopencv_imgproc.so.4.1 (0x00007f49c3b12000)
Даже если в * 1039 есть действительная ссылка * ldd output, libopencv_imgpro c .so не существует в readelf output. Я предполагаю, что, поскольку нет исходного кода, напрямую потребляющего imgpro c, он не отображается в выводе readelf .
Может кто-нибудь указать, что является причиной ошибки " не удается открыть общий объектный файл "?
РЕДАКТИРОВАТЬ: я изменил свой код выше, чтобы включить imgpro c* Заголовок 1056 * и объявите класс ниже, как показано ниже:
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
cv::Subdiv2D div; // comes from imgproc
cv::Mat img = cv::imread("sample.jpg", ZM_MAX_IMAGE_COLOURS);
cv::imwrite("sample-opencv.jpg", img);
Сработало после этого изменения. Кроме того, ниже представлен новый readelf output:
$ readelf -d <executable name>
0x0000000000000001 (NEEDED) Shared library: [libopencv_imgcodecs.so.4.1]
0x0000000000000001 (NEEDED) Shared library: [libopencv_imgproc.so.4.1]
0x0000000000000001 (NEEDED) Shared library: [libopencv_core.so.4.1]
0x000000000000001d (RUNPATH) Library runpath: [<path to opencv>/opencv/lib:]
Однако это всего лишь обходной путь. Не нужно писать такой код-заполнитель. Может ли кто-нибудь помочь найти чистое решение для правильного включения общих объектов? К вашему сведению - вот внутренние зависимости между этими общими объектами opencv:
libopencv_core -> нет зависимости
libopencv_imgpro c -> libopencv_core
libopencv_imcodecs - -> libopencv_core и libopencv_imgpro c