【问题标题】:OpenCV fails to link libtiff when build with Matlab使用 Matlab 构建时,OpenCV 无法链接 libtiff
【发布时间】:2019-06-06 13:04:31
【问题描述】:

基本上,这个问题与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'

问题是/usr/local/MATLAB/R2015b/bin/glnxa64 中还存在一个libtiff.so.5。此时链接器似乎搞砸了。因此,与其在 Matlab 的二进制目录中重命名 libtiff.so.5,那么正确的解决方法是什么?

【问题讨论】:

  • 如果 matlab 共享库链接到 libtiff.so.4 而 opencv 共享库链接到 libtiff.so.5,那么除了 rebuild matlab 或 opencv 之外别无选择,所以两者都有将与相同的libtiff 库链接。使用ldd /usr/local/lib/libopencv_imgcodecs.so.3.3.1,您可以检查libopencv 需要哪些库;可以使用相同的方法检查matlab 库。
  • @Tsyvarev 嗨!正如你所说,我运行ldd ...,发现OpenCV链接libtiff.so.5,但libmat.solibmx.solibmex.so根本不需要libtiff.so.5 libtiff.so.4
  • 嗯,那你的库有问题。你确定你过去没有重命名它们吗?我的意思是,手动重命名,因为操作系统包管理器从不做这样的事情(当新版本的库发布时,它只是添加新的 lib*.so.x.y 文件而不删除旧文件)。
  • 我确保我之前没有重命名,实际上,一旦我在 /usr/local/MATLAB/R2015b/bin/glnxa64 中重命名了 libtiff.so.5,它就起作用了。

标签: matlab opencv cmake linker


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 2013-11-29
    • 2015-12-07
    • 2018-01-06
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多