Интегрировать OpenCV с помощью cmake - не удается открыть общий объектный файл - PullRequest
2 голосов
/ 08 января 2020

Я пытаюсь интегрировать 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...