Ubuntu上OpenCV版本冲突导致未定义的引用问题
问题描述:
最近在编译Darknet-ROS-YOLOv4时,遇到如下问题
/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgcodecs3.so.3.3.1:对‘TIFFReadDirectory@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFLastDirectory@LIBTIFF_4.0’未定义的引用
/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgcodecs3.so.3.3.1:对‘TIFFWriteEncodedStrip@LIBTIFF_4.0’未定义的引用
/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgcodecs3.so.3.3.1:对‘TIFFIsTiled@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFIsByteSwapped@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFComputeStrip@LIBTIFF_4.0’未定义的引用
/opt/ros/kinetic/lib/libresource_retriever.so:对‘curl_easy_init@CURL_OPENSSL_3’未定义的引用
/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgcodecs3.so.3.3.1:对‘TIFFScanlineSize@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFTileSize@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFFieldReadCount@LIBTIFF_4.0’未定义的引用
/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgcodecs3.so.3.3.1:对‘TIFFRGBAImageOK@LIBTIFF_4.0’未定义的引用
/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgcodecs3.so.3.3.1:对‘TIFFClose@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFSetTagExtender@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFGetFieldDefaulted@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFSwabArrayOfLong@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFFieldPassCount@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFFieldDataType@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFStripSize@LIBTIFF_4.0’未定义的引用
/opt/ros/kinetic/lib/libresource_retriever.so:对‘curl_easy_perform@CURL_OPENSSL_3’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘_TIFFDataSize@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFMergeFieldInfo@LIBTIFF_4.0’未定义的引用
/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgcodecs3.so.3.3.1:对‘TIFFSetWarningHandler@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFReadEXIFDirectory@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFFieldTag@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFTileRowSize@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFCurrentDirectory@LIBTIFF_4.0’未定义的引用
/opt/ros/kinetic/lib/libresource_retriever.so:对‘curl_easy_setopt@CURL_OPENSSL_3’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFDefaultStripSize@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFReadTile@LIBTIFF_4.0’未定义的引用
/opt/ros/kinetic/lib/libresource_retriever.so:对‘curl_easy_cleanup@CURL_OPENSSL_3’未定义的引用
/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgcodecs3.so.3.3.1:对‘TIFFWriteScanline@LIBTIFF_4.0’未定义的引用
/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgcodecs3.so.3.3.1:对‘TIFFGetField@LIBTIFF_4.0’未定义的引用
/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgcodecs3.so.3.3.1:对‘TIFFNumberOfStrips@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFWriteDirectory@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFFieldWithTag@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFFieldName@LIBTIFF_4.0’未定义的引用
/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgcodecs3.so.3.3.1:对‘TIFFReadEncodedTile@LIBTIFF_4.0’未定义的引用
/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgcodecs3.so.3.3.1:对‘TIFFReadRGBATile@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFGetTagListEntry@LIBTIFF_4.0’未定义的引用
/opt/ros/kinetic/lib/libresource_retriever.so:对‘curl_global_cleanup@CURL_OPENSSL_3’未定义的引用
/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgcodecs3.so.3.3.1:对‘TIFFClientOpen@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFGetTagListCount@LIBTIFF_4.0’未定义的引用
/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgcodecs3.so.3.3.1:对‘TIFFOpen@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFSetSubDirectory@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFReadRGBAImage@LIBTIFF_4.0’未定义的引用
/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgcodecs3.so.3.3.1:对‘TIFFReadEncodedStrip@LIBTIFF_4.0’未定义的引用
/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgcodecs3.so.3.3.1:对‘TIFFSetField@LIBTIFF_4.0’未定义的引用
/opt/ros/kinetic/lib/libresource_retriever.so:对‘curl_global_init@CURL_OPENSSL_3’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFDataWidth@LIBTIFF_4.0’未定义的引用
/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgcodecs3.so.3.3.1:对‘TIFFSetErrorHandler@LIBTIFF_4.0’未定义的引用
//usr/lib/x86_64-linux-gnu/libfreeimage.so.3:对‘TIFFSetDirectory@LIBTIFF_4.0’未定义的引用
/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgcodecs3.so.3.3.1:对‘TIFFReadRGBAStrip@LIBTIFF_4.0’未定义的引用
原因分析:
在网上查找相关博文后将问题定位为Ubuntu中OpenCV的版本冲突问题。该问题是由于我的电脑上安装有源码编译的OpenCV,与Ubuntu中ROS自带的ros-opencv之间产生版本冲突。
解决方案:
定位到/src/darknet_ros/darknet_ros/中的CMakeLists.txt文件,在文件中制定位置添加如下字段即可解决。
target_link_libraries(${PROJECT_NAME}
${OpenCV_LIBS} /usr/lib/x86_64-linux-gnu/libtiff.so.5
)