首页 > 解决方案 > 使用 Matlab 构建时,OpenCV 无法链接 libtiff

问题描述

基本上,这个问题与这篇文章相同,但到目前为止尚未解决。这是我的 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.5in /usr/local/MATLAB/R2015b/bin/glnxa64。此时链接器似乎搞砸了。因此,与其libtiff.so.5在 Matlab 的二进制目录中重命名,什么是正确的解决方法?

标签: matlabopencvcmakelinker

解决方案


我注意到 MATLAB R2016a(不是更高版本)和使用 LibTIFF 的 MEX 文件(虽然不是通过 OpenCV)也有同样的事情。我认为他们在那个版本的 MATLAB 中对 LibTIFF 库做了一些奇怪的事情。该 MATLAB 或更新的 MATLAB 具有更新版本的 LibTIFF,可以满足我的 MEX 文件的所有要求。

即使您在 MEX 文件中正确设置了正确的 RPATH,MATLAB 也已经加载了 LibTIFF 共享库,因此当它加载您的 MEX 文件时,它将链接到已经在内存中的 LibTIFF。

与往常一样,解决方案是使用静态链接。重建 OpenCV 以静态链接 LibTIFF。如果您使用静态链接,您的代码将始终使用它们链接的 LibTIFF 函数,而不是碰巧在内存中的任何共享对象中的函数。


推荐阅读