代码之家  ›  专栏  ›  技术社区  ›  Finley

使用matlab构建时,opencv无法链接libtiff

  •  0
  • Finley  · 技术社区  · 6 年前

    基本上,这个问题与 this post 到目前为止还没有解决。以下是我的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 . 链接器似乎在这一点上搞砸了。所以不用重命名 LIbTIF.S.S. 5 在matlab的二进制目录中,正确的解决方法是什么?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Cris Luengo    6 年前

    我注意到Matlabr2016a(不适用于更高版本)和使用libtiff的mex文件(但不适用于opencv)也有同样的情况。我认为他们在那个版本的matlab中对libtiff库做了一些奇怪的事情。或者更新的Matlabs有一个更新版本的libtiff,可以满足我的mex文件的所有要求。

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

    解决方案一如既往地是使用静态链接。重建opencv以静态链接libtiff。如果您使用静态链接,您的代码将始终使用它们链接的libtiff函数,而不会使用任何共享对象中正好在内存中的函数。