OpenCV не может связать libtiff при сборке с Matlab - PullRequest
0 голосов
/ 11 января 2019

По сути, этот вопрос такой же, как и в этом посте , но пока не решен. Вот мои сценарии CMake:

FIND_PACKAGE(OpenCV REQUIRED)
FIND_PACKAGE(Matlab REQUIRED)

SET(Matlab_DEP_LIBS ${Matlab_LIBRARIES} libmx.so libmat.so)
SET(OpenCV_DEP_LIBS opencv_core opencv_imgproc opencv_imgcodecs)

ADD_EXECUTABLE(myApp ${mySources})
TARGET_LINK_LIBRARIES(myAPP ${Matlab_DEP_LIBS}                        
${OpenCV_DEP_LIBS})

компилятор сообщил об ошибках связи:

/usr/local/lib/libopencv_imgcodecs.so.3.3.1: undefined reference to `TIFFReadDirectory@LIBTIFF_4.0'
/usr/local/lib/libopencv_imgcodecs.so.3.3.1: undefined reference to `TIFFWriteEncodedStrip@LIBTIFF_4.0'
/usr/local/lib/libopencv_imgcodecs.so.3.3.1: undefined reference to `TIFFIsTiled@LIBTIFF_4.0'
/usr/local/lib/libopencv_imgcodecs.so.3.3.1: undefined reference to `TIFFOpen@LIBTIFF_4.0'
/usr/local/lib/libopencv_imgcodecs.so.3.3.1: undefined reference to `TIFFReadEncodedStrip@LIBTIFF_4.0'
/usr/local/lib/libopencv_imgcodecs.so.3.3.1: undefined reference to `TIFFSetField@LIBTIFF_4.0'
/usr/local/lib/libopencv_imgcodecs.so.3.3.1: undefined reference to `TIFFWriteScanline@LIBTIFF_4.0'
/usr/local/lib/libopencv_imgcodecs.so.3.3.1: undefined reference to `TIFFGetField@LIBTIFF_4.0'
/usr/local/lib/libopencv_imgcodecs.so.3.3.1: undefined reference to `TIFFScanlineSize@LIBTIFF_4.0'
/usr/local/lib/libopencv_imgcodecs.so.3.3.1: undefined reference to `TIFFNumberOfStrips@LIBTIFF_4.0'
/usr/local/lib/libopencv_imgcodecs.so.3.3.1: undefined reference to `TIFFSetWarningHandler@LIBTIFF_4.0'
/usr/local/lib/libopencv_imgcodecs.so.3.3.1: undefined reference to `TIFFSetErrorHandler@LIBTIFF_4.0'
/usr/local/lib/libopencv_imgcodecs.so.3.3.1: undefined reference to `TIFFReadEncodedTile@LIBTIFF_4.0'
/usr/local/lib/libopencv_imgcodecs.so.3.3.1: undefined reference to `TIFFReadRGBATile@LIBTIFF_4.0'
/usr/local/lib/libopencv_imgcodecs.so.3.3.1: undefined reference to `TIFFClose@LIBTIFF_4.0'
/usr/local/lib/libopencv_imgcodecs.so.3.3.1: undefined reference to `TIFFRGBAImageOK@LIBTIFF_4.0'
/usr/local/lib/libopencv_imgcodecs.so.3.3.1: undefined reference to `TIFFClientOpen@LIBTIFF_4.0'
/usr/local/lib/libopencv_imgcodecs.so.3.3.1: undefined reference to `TIFFReadRGBAStrip@LIBTIFF_4.0'

Проблема в том, что также существует libtiff.so.5 в /usr/local/MATLAB/R2015b/bin/glnxa64. Кажется, что компоновщик не работает в этой точке. Таким образом, вместо переименования libtiff.so.5 в двоичном каталоге Matlab, каков правильный обходной путь?

1 Ответ

0 голосов
/ 11 января 2019

Я заметил то же самое с MATLAB R2016a (не с более поздними версиями) и MEX-файлами, которые используют LibTIFF (но не через OpenCV). Я думаю, что они сделали что-то странное с библиотекой LibTIFF в этой версии MATLAB. Либо это, либо новые MATLABs имеют более новую версию LibTIFF, которая может удовлетворить все требования моих MEX-файлов.

Даже если вы правильно установили правильный RPATH в своем MEX-файле, MATLAB уже загрузит разделяемую библиотеку LibTIFF, поэтому, когда он загружает ваш MEX-файл, он будет связан с LibTIFF, который уже находится в памяти.

Решение, как всегда, заключается в использовании статического связывания. Перестройте OpenCV, чтобы статически связать LibTIFF. Если вы используете статическое связывание, ваш код всегда будет использовать функции LibTIFF, с которыми они были связаны, и никогда не использовать те функции в любом общем объекте, который находится в памяти.

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