Debian, компилирующий примеры OpenCV с IPP: / usr / bin / ld: не удается найти -llibsvml.so collect2: error: ld возвратил 1 статус выхода

Среда: Debian 7.5 Wheezy.

Я только что скомпилировал и установил библиотеки OpenCV версии 2.4.9 с активированными примитивами Intel IPP (Integrated Performance Primitives). Я установил IPP в / opt / ipp, версия 8.1 SP 3.

Во время cmake он находит правильные библиотеки IPP, без проблем компилирует и устанавливает в / opt / OpenCV.

Когда я перехожу в папку c примерами, там есть скрипт, который компилирует все примеры:

$ ls /opt/OpenCV/OpenCV-2.4.9/share/OpenCV/samples/c
adaptiveskindetector.cpp  box_in_scene.png   facedetect.cmd         latentsvmdetect.cpp     one_way_train_0001.jpg
agaricus-lepiota.data     box.png            facedetect.cpp         lena.jpg                polar_transforms.c
airplane.jpg              build_all.sh       fback_c.c              morphology.c            puzzle.png
baboon200.jpg             cat.jpg            find_obj_calonder.cpp  motempl.c               pyramid_segmentation.c
baboon200_rotated.jpg     contours.c         find_obj.cpp           mser_sample.cpp         smiledetect.cpp
baboon.jpg                convert_cascade.c  find_obj_ferns.cpp     mushroom.cpp            stuff.jpg
bgfg_codebook.cpp         cvsample.dsp       fruits.jpg             one_way_sample.cpp      tree_engine.cpp
blobtrack_sample.cpp      delaunay.c         JCB.png                one_way_train_0000.jpg  waveform.data

Теперь запустим скрипт:

$ ./build_all.sh

Каждый исходный файл дает такой вывод:

compiling tree_engine.cpp
/usr/bin/ld: cannot find -llibsvml.so
/usr/bin/ld: cannot find -llibimf.so
/usr/bin/ld: cannot find -llibirc.so
/usr/bin/ld: cannot find -llibippcore.a
/usr/bin/ld: cannot find -llibipps.a
/usr/bin/ld: cannot find -llibippi.a
/usr/bin/ld: cannot find -llibippcv.a
/usr/bin/ld: cannot find -llibippcc.a
/usr/bin/ld: cannot find -llibippvm.a
collect2: error: ld returned 1 

Содержимое build_all.sh:

#!/bin/sh

if [ $# -gt 0 ] ; then
    base=`basename $1 .c`
    echo "compiling $base"
    gcc -ggdb `pkg-config opencv --cflags --libs` $base.c -o $base
else
    for i in *.c; do
        echo "compiling $i"
        gcc -ggdb `pkg-config --cflags opencv` -o `basename $i .c` $i `pkg-config --libs opencv`;
    done
    for i in *.cpp; do
        echo "compiling $i"
        g++ -ggdb `pkg-config --cflags opencv` -o `basename $i .cpp` $i `pkg-config --libs opencv`;
    done
fi

Сфокусируемся на первой ненайденной библиотеке (/ usr / bin / ld: cannot find -llibsvml.so).

Это в системе: $ locate libsvml.so /opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/ia32/libsvml.so /opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/intel64/libsvml.so / opt / opt / /composer_xe_2013_sp1.3.174/compiler/lib/mic/libsvml.so

Его папка находится в LD_LIBRARY_PATH:

$ echo $LD_LIBRARY_PATH 
/opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/intel64:/opt/intel/composer_xe_2013_sp1.3.174/mpirt/lib/intel64:/opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/intel64:/opt/intel/composer_xe_2013_sp1.3.174/ipp/lib/intel64:/opt/OpenCV/OpenCV-2.4.9/lib

В LIBRARY_PATH тоже:

$ echo $LIBRARY_PATH 
/opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/intel64:/opt/intel/composer_xe_2013_sp1.3.174/ipp/lib/intel64

Насколько я понимаю, скрипт buildAll использует pkg-config для поиска библиотек. Примечательно, что эти команды ничего не возвращают при запуске:

$ pkg-config --list-all | grep ipp
$ pkg-config --list-all | grep vml
$ dpkg -l | grep ipp
$ dpkg -l | grep vml

Куда смотрит gcc во время компиляции:

$ gcc --print-search-dirs
install: /usr/lib/gcc/x86_64-linux-gnu/4.7/
programs: =/usr/lib/gcc/x86_64-linux-gnu/4.7/:/usr/lib/gcc/x86_64-linux-gnu/4.7/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.7/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/4.7/:/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../x86_64-linux-gnu/bin/
libraries: =/opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/intel64/x86_64-linux-gnu/4.7/:/opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/intel64/x86_64-linux-gnu/:/opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/intel64/../lib/:/opt/intel/composer_xe_2013_sp1.3.174/ipp/lib/intel64/x86_64-linux-gnu/4.7/:/opt/intel/composer_xe_2013_sp1.3.174/ipp/lib/intel64/x86_64-linux-gnu/:/opt/intel/composer_xe_2013_sp1.3.174/ipp/lib/intel64/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.7/:/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../x86_64-linux-gnu/lib/x86_64-linux-gnu/4.7/:/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../x86_64-linux-gnu/lib/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../x86_64-linux-gnu/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/4.7/:/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/:/lib/x86_64-linux-gnu/4.7/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/4.7/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/intel64/:/opt/intel/composer_xe_2013_sp1.3.174/ipp/lib/intel64/:/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../x86_64-linux-gnu/lib/:/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../:/lib/:/usr/lib/

Как я могу это скомпилировать, чтобы gcc находил библиотеки IPP?


ИЗМЕНИТЬ 1

Я попытался создать файл /etc/ld.so.conf.d/IntelIPP.conf и добавить туда пути для Intel IPP, заданные в LD_LIBRARY_PATH, перезапустить систему и перекомпилировать. Нет эффекта.

Но я предполагаю об этом: "/ usr / bin / ld: cannot find -llibsvml.so" должно означать, что он ищет "liblibsvml.so" (ld достаточно "lib" я думаю, внутренне к именам файлов библиотек).

Еще одно замечание: "gcc -ggdb pkg-config --cflags opencv -o basename $i .c $ i` pkg-config --libs " выполняет pkg-config только для opencv, IPP не называется вообще. Итак, возможно, это место в библиотеке, жестко запрограммированное OpenCV во время компиляции или установки.

Есть какие-нибудь подсказки об этом?


ИЗМЕНИТЬ 2

Следуя этому новому подходу, я перешел в ~ / Downloads / openscv-2.4.9 / cmake / OpenCVFindIPP.cmake и изменил:

# ------------------------------------------------------------------------
# This is auxiliary function called from set_ipp_variables()
# to set IPP_LIBRARIES variable in IPP 7.x and 8.x style
# ------------------------------------------------------------------------
function(set_ipp_new_libraries _LATEST_VERSION)
    set(IPP_PREFIX "ipp")

    if(${_LATEST_VERSION} VERSION_LESS "8.0")
        set(IPP_SUFFIX "_l")        # static not threaded libs suffix IPP 7.x
    else()
        if(WIN32)
            set(IPP_SUFFIX "mt")    # static not threaded libs suffix IPP 8.x for Windows
        else()
            set(IPP_SUFFIX "")      # static not threaded libs suffix IPP 8.x for Linux/OS X
        endif()
    endif()
    set(IPPCORE    "core")     # core functionality
    set(IPPSP      "s")        # signal processing
    set(IPPIP      "i")        # image processing
    set(IPPCC      "cc")       # color conversion
    set(IPPCV      "cv")       # computer vision
    set(IPPVM      "vm")       # vector math

    set(IPP_LIBRARIES
        ${IPP_PREFIX}${IPPVM}${IPP_SUFFIX}${IPP_LIB_SUFFIX}
        ${IPP_PREFIX}${IPPCC}${IPP_SUFFIX}${IPP_LIB_SUFFIX}
        ${IPP_PREFIX}${IPPCV}${IPP_SUFFIX}${IPP_LIB_SUFFIX}
        ${IPP_PREFIX}${IPPI}${IPP_SUFFIX}${IPP_LIB_SUFFIX}
        ${IPP_PREFIX}${IPPS}${IPP_SUFFIX}${IPP_LIB_SUFFIX}
        ${IPP_PREFIX}${IPPCORE}${IPP_SUFFIX}${IPP_LIB_SUFFIX})

    if (UNIX)
        set(IPP_LIBRARIES
            ${IPP_LIBRARIES}
            irc${CMAKE_SHARED_LIBRARY_SUFFIX}
            imf${CMAKE_SHARED_LIBRARY_SUFFIX}
            svml${CMAKE_SHARED_LIBRARY_SUFFIX})
    endif()
    set(IPP_LIBRARIES ${IPP_LIBRARIES} PARENT_SCOPE)
    return()

endfunction()

by:

# ------------------------------------------------------------------------
# This is auxiliary function called from set_ipp_variables()
# to set IPP_LIBRARIES variable in IPP 7.x and 8.x style
# ------------------------------------------------------------------------
function(set_ipp_new_libraries _LATEST_VERSION)
    set(IPP_PREFIX "ipp")

    if(${_LATEST_VERSION} VERSION_LESS "8.0")
        set(IPP_SUFFIX "_l")        # static not threaded libs suffix IPP 7.x
    else()
        if(WIN32)
            set(IPP_SUFFIX "mt")    # static not threaded libs suffix IPP 8.x for Windows
        else()
            set(IPP_SUFFIX "")      # static not threaded libs suffix IPP 8.x for Linux/OS X
        endif()
    endif()
    set(IPPCORE    "core")     # core functionality
    set(IPPSP      "s")        # signal processing
    set(IPPIP      "i")        # image processing
    set(IPPCC      "cc")       # color conversion
    set(IPPCV      "cv")       # computer vision
    set(IPPVM      "vm")       # vector math

    set(IPP_LIBRARIES
        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPVM}${IPP_SUFFIX}${IPP_LIB_SUFFIX}
        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPCC}${IPP_SUFFIX}${IPP_LIB_SUFFIX}
        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPCV}${IPP_SUFFIX}${IPP_LIB_SUFFIX}
        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPI}${IPP_SUFFIX}${IPP_LIB_SUFFIX}
        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPS}${IPP_SUFFIX}${IPP_LIB_SUFFIX}
        ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPCORE}${IPP_SUFFIX}${IPP_LIB_SUFFIX})

    if (UNIX)
        set(IPP_LIBRARIES
            ${IPP_LIBRARIES}
            ${IPP_LIB_PREFIX}irc${CMAKE_SHARED_LIBRARY_SUFFIX}
            ${IPP_LIB_PREFIX}imf${CMAKE_SHARED_LIBRARY_SUFFIX}
            ${IPP_LIB_PREFIX}svml${CMAKE_SHARED_LIBRARY_SUFFIX})
    endif()
    set(IPP_LIBRARIES ${IPP_LIBRARIES} PARENT_SCOPE)
    return()

endfunction()

Перекомпилировал OpenCV и успешно установил ... безуспешно. Компиляция примеров теперь дает ту же ошибку, но без "lib":

compiling tree_engine.cpp
/usr/bin/ld: cannot find -lsvml.so
/usr/bin/ld: cannot find -limf.so
/usr/bin/ld: cannot find -lirc.so
/usr/bin/ld: cannot find -lippcore.a
/usr/bin/ld: cannot find -lipps.a
/usr/bin/ld: cannot find -lippi.a
/usr/bin/ld: cannot find -lippcv.a
/usr/bin/ld: cannot find -lippcc.a
/usr/bin/ld: cannot find -lippvm.a
collect2: error: ld returned 1 exit status

РЕДАКТИРОВАТЬ 3

Другой подход: поиск «svml» в /opt/OpenCV/OpenCV-2.4.9/.

В результате получается 2 файла.

/opt/OpenCV/OpenCV-2.4.9/share/OpenCV/OpenCVModules-debug.cmake:

# Import target "opencv_ts" for configuration "Debug"
SET_PROPERTY(TARGET opencv_ts APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
SET_TARGET_PROPERTIES(opencv_ts PROPERTIES
  IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "CXX"
  IMPORTED_LINK_INTERFACE_LIBRARIES_DEBUG "opencv_core;opencv_flann;opencv_imgproc;opencv_highgui;opencv_features2d;dl;m;pthread;rt;/usr/lib/x86_64-linux-gnu/libGLU.so;/usr/lib/x86_64-linux-gnu/libGL.so;/usr/lib/x86_64-linux-gnu/libSM.so;/usr/lib/x86_64-linux-gnu/libICE.so;/usr/lib/x86_64-linux-gnu/libX11.so;/usr/lib/x86_64-linux-gnu/libXext.so;tbb;libippvm.a;libippcc.a;libippcv.a;libippi.a;libipps.a;libippcore.a;libirc.so;libimf.so;libsvml.so"
  IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/lib/libopencv_ts.a"
  )

LIST(APPEND _IMPORT_CHECK_TARGETS opencv_ts )
LIST(APPEND _IMPORT_CHECK_FILES_FOR_opencv_ts "${_IMPORT_PREFIX}/lib/libopencv_ts.a" )

Показаны только строки с 211 по 220. Не уверен, что эти строки на самом деле означают.

/opt/OpenCV/OpenCV-2.4.9/lib/pkgconfig/opencv.pc

# Package Information for pkg-config

prefix=/opt/OpenCV/OpenCV-2.4.9
exec_prefix=${prefix}
libdir=
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include

Name: OpenCV
Description: Open Source Computer Vision Library
Version: 2.4.9
Libs:  ${exec_prefix}/lib/libopencv_calib3d.so ${exec_prefix}/lib/libopencv_contrib.so ${exec_prefix}/lib/libopencv_core.so ${exec_prefix}/lib/libopencv_features2d.so ${exec_prefix}/lib/libopencv_flann.so ${exec_prefix}/lib/libopencv_gpu.so ${exec_prefix}/lib/libopencv_highgui.so ${exec_prefix}/lib/libopencv_imgproc.so ${exec_prefix}/lib/libopencv_legacy.so ${exec_prefix}/lib/libopencv_ml.so ${exec_prefix}/lib/libopencv_nonfree.so ${exec_prefix}/lib/libopencv_objdetect.so ${exec_prefix}/lib/libopencv_ocl.so ${exec_prefix}/lib/libopencv_photo.so ${exec_prefix}/lib/libopencv_stitching.so ${exec_prefix}/lib/libopencv_superres.so ${exec_prefix}/lib/libopencv_ts.a ${exec_prefix}/lib/libopencv_video.so ${exec_prefix}/lib/libopencv_videostab.so ${exec_prefix}/lib/libopencv_viz.so -llibsvml.so -llibimf.so -llibirc.so -llibippcore.a -llibipps.a -llibippi.a -llibippcv.a -llibippcc.a -llibippvm.a -ltbb /usr/lib/x86_64-linux-gnu/libXext.so /usr/lib/x86_64-linux-gnu/libX11.so /usr/lib/x86_64-linux-gnu/libICE.so /usr/lib/x86_64-linux-gnu/libSM.so /usr/lib/x86_64-linux-gnu/libGL.so /usr/lib/x86_64-linux-gnu/libGLU.so -lrt -lpthread -lm -ldl
Cflags: -I${includedir_old} -I${includedir_new}

Я думаю, что этот файл действительно интересен, насколько я знаю, это файл, который используется pkg-config и ld для загрузки библиотек при компоновке и компиляции.

Обратите внимание на это:

Библиотеки: (...) $ {exec_prefix} /lib/libopencv_viz.so -llibsvml.so -llibimf.so -llibirc.so -llibippcore.a -llibipps.a -llibippi.a -llibippcv.a -llibippcc .a -llibippvm.a -ltbb /usr/lib/x86_64-linux-gnu/libXext.so (..)

Я все еще не уверен, что делать ... -l [xxx] должен загружать xxx из LD_LIBRARY_PATH, так что это должно сработать ... есть идеи?


person Bull    schedule 15.06.2014    source источник


Ответы (1)


Решил сам.

Отредактировал /opt/OpenCV/OpenCV-2.4.9/lib/pkgconfig/opencv.pc и поместил это:

# Package Information for pkg-config

prefix=/opt/OpenCV/OpenCV-2.4.9
exec_prefix=${prefix}
libdir=
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include

#RLP 16-06-14: For Intel IPP 8.1
IntelIPPCompilerLib=/opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/intel64
IntelIPPIPPLib=/opt/intel/composer_xe_2013_sp1.3.174/ipp/lib/intel64
#RLP'end

Name: OpenCV
Description: Open Source Computer Vision Library
Version: 2.4.9
#RLP 16-06-14: For Intel IPP 8.1
#Libs:  ${exec_prefix}/lib/libopencv_calib3d.so ${exec_prefix}/lib/libopencv_contrib.so ${exec_prefix}/lib/libopencv_core.so ${exec_prefix}/lib/libopencv_features2d.so ${exec_prefix}/lib/libopencv_flann.so ${exec_prefix}/lib/libopencv_gpu.so ${exec_prefix}/lib/libopencv_highgui.so ${exec_prefix}/lib/libopencv_imgproc.so ${exec_prefix}/lib/libopencv_legacy.so ${exec_prefix}/lib/libopencv_ml.so ${exec_prefix}/lib/libopencv_nonfree.so ${exec_prefix}/lib/libopencv_objdetect.so ${exec_prefix}/lib/libopencv_ocl.so ${exec_prefix}/lib/libopencv_photo.so ${exec_prefix}/lib/libopencv_stitching.so ${exec_prefix}/lib/libopencv_superres.so ${exec_prefix}/lib/libopencv_ts.a ${exec_prefix}/lib/libopencv_video.so ${exec_prefix}/lib/libopencv_videostab.so ${exec_prefix}/lib/libopencv_viz.so -llibsvml.so -llibimf.so -llibirc.so -llibippcore.a -llibipps.a -llibippi.a -llibippcv.a -llibippcc.a -llibippvm.a -ltbb /usr/lib/x86_64-linux-gnu/libXext.so /usr/lib/x86_64-linux-gnu/libX11.so /usr/lib/x86_64-linux-gnu/libICE.so /usr/lib/x86_64-linux-gnu/libSM.so /usr/lib/x86_64-linux-gnu/libGL.so /usr/lib/x86_64-linux-gnu/libGLU.so -lrt -lpthread -lm -ldl
Libs:  ${exec_prefix}/lib/libopencv_calib3d.so ${exec_prefix}/lib/libopencv_contrib.so ${exec_prefix}/lib/libopencv_core.so ${exec_prefix}/lib/libopencv_features2d.so ${exec_prefix}/lib/libopencv_flann.so ${exec_prefix}/lib/libopencv_gpu.so ${exec_prefix}/lib/libopencv_highgui.so ${exec_prefix}/lib/libopencv_imgproc.so ${exec_prefix}/lib/libopencv_legacy.so ${exec_prefix}/lib/libopencv_ml.so ${exec_prefix}/lib/libopencv_nonfree.so ${exec_prefix}/lib/libopencv_objdetect.so ${exec_prefix}/lib/libopencv_ocl.so ${exec_prefix}/lib/libopencv_photo.so ${exec_prefix}/lib/libopencv_stitching.so ${exec_prefix}/lib/libopencv_superres.so ${exec_prefix}/lib/libopencv_ts.a ${exec_prefix}/lib/libopencv_video.so ${exec_prefix}/lib/libopencv_videostab.so ${exec_prefix}/lib/libopencv_viz.so ${IntelIPPCompilerLib}/libsvml.so ${IntelIPPCompilerLib}/libimf.so ${IntelIPPCompilerLib}/libirc.so ${IntelIPPIPPLib}/libippcore.a ${IntelIPPIPPLib}/libipps.a ${IntelIPPIPPLib}/libippi.a ${IntelIPPIPPLib}/libippcv.a ${IntelIPPIPPLib}/libippcc.a ${IntelIPPIPPLib}/libippvm.a -ltbb /usr/lib/x86_64-linux-gnu/libXext.so /usr/lib/x86_64-linux-gnu/libX11.so /usr/lib/x86_64-linux-gnu/libICE.so /usr/lib/x86_64-linux-gnu/libSM.so /usr/lib/x86_64-linux-gnu/libGL.so /usr/lib/x86_64-linux-gnu/libGLU.so -lrt -lpthread -lm -ldl
#RLP'end
Cflags: -I${includedir_old} -I${includedir_new}

И теперь система на эту библиотеку не жалуется.

Что меня удивило, так это то, что в разделе Libs я безуспешно пытался использовать несколько комбинаций стиля -L + -l. (пример: -L / opt / intel / composer_xe_2013_sp1.3.174 / compiler / lib / intel64 -llibsmvl.so (и -svml)).

Поэтому я решил указать пути к папкам напрямую в библиотеки IPP.

person Bull    schedule 17.06.2014
comment
Очень полезно! Спасибо! - person mining; 29.08.2014