2014-06-15 1 views
3

환경 : Debian 7.5 Wheezy.데비안은 IPP로 OpenCV 예제를 컴파일합니다 :/usr/bin/ld : -llibsvml.so collect2 : 오류 : ld가 1 종료 상태를 반환했습니다.

인텔 IPP (Integrated Performance Primitives)가 활성화 된 OpenCV 라이브러리 버전 2.4.9를 컴파일하고 설치했습니다./opt/ipp, 버전 8.1 SP 3에 IPP를 설치했습니다.

cmake 동안 OK IPP 라이브러리를 찾고 문제없이 컴파일하고/opt/OpenCV에 설치합니다. 모든 소스 파일은 다음과 같은 출력을 제공

$ ./build_all.sh 

:의 스크립트를 실행할 수 있도록 지금

$ 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 

:

나는 C 예제 폴더로 이동, 모든 예제를 컴파일하는 스크립트있다 : 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 

내용 :

#!/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 : -llibsvml.so를 찾을 수 없음)에 집중합시다.

이 시스템에있다 : $가 /opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/intel64/ /opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/ia32/libsvml.so libsvml.so 찾습니다 너무

$ 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에서 :

/opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/mic/libsvml.so 그 폴더는 LD_LIBRARY_PATH에 libsvml.so

필자가 볼 수있는 한 buildAll 스크립트는 라이브러리를 찾기 위해 pkg-config를 사용합니다. GCC입니다

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

컴파일하는 동안 찾고 :

$ 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 라이브러리를 발견, 그래서 눈에 띄는 실행할 때 이러한 명령은 아무것도 돌려주지 않는 것입니다?


내가 LD_LIBRARY_PATH에서 인텔 IPP 세트에 대한 경로를 파일 /etc/ld.so.conf.d/IntelIPP.conf을 만들고 거기에 추가 해봤 1

편집, 시스템을 재시작 다시 컴파일하십시오. 효과가 없습니다.

하지만, 나는 이것에 대해 추측하고있어 : : 그것이 "liblibsvml.so"을 찾고 있다는 것을 의미한다 "는/usr/빈/LD는 -llibsvml.so 찾을 수 없습니다"(LD는 "LIB"내부를 충분 라이브러리 파일 이름에, 나는 생각한다).

또 다른 점

가 통지 : "GCC -ggdb pkg-config --cflags opencv -o basename $i .c $ 난`PKG-설정은 --libs"는 OpenCV의에 대해 PKG-설정을 실행, 더 IPP는 전혀 이름이 없습니다. 그래서 아마도 컴파일이나 설치 중에 OpenCV에 의해 하드 코딩 된 lib 위치 ​​일 것입니다.

실마리가 있습니까?


편집 2

이 새로운 접근 방식에 따라, 나는 ~/다운로드/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() 

비접촉식

# ------------------------------------------------------------------------ 
# 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 

EDIT 3

또 다른 방법 : /opt/OpenCV/OpenCV-2.4.9/에서 "svml"를 검색.

두 개의 파일이 생성됩니다.

/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를 사용하여 링크 및 컴파일 할 때 라이브러리를로드합니다.

참고이 :

libs와 (...) /lib/libopencv_viz.so $ {exec_prefix}를 지정하여야된다 -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]는 LD_LIBRARY_PATH에서 xxx를로드한다고 가정 했으므로 ...이 아이디어가 필요합니까?

답변

2

직접 해결.

# 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} 

을 이제 시스템은이 라이브러리에 대해 불평하지 않습니다

편집 /opt/OpenCV/OpenCV-2.4.9/lib/pkgconfig/opencv.pc 및이를 넣어.

Libs 섹션에서 나는 여러 가지 스타일의 콤보를 사용하려고 시도했습니다. -L + -l은 성공하지 못했습니다. (예 : -L/opt/intel/composer_xe_2013_sp1.3.174/컴파일러/lib/intel64 -llibsmvl.so (및 -svml)).

그래서 폴더 경로를 IPP 라이브러리에 직접 적용하기로 결정했습니다.

+0

매우 유용합니다! 고맙습니다! – mining

관련 문제