Reputation: 758
Environment: Debian 7.5 Wheezy.
I've just compiled and installed OpenCV libraries, version 2.4.9, with Intel IPP (Integrated Performance Primitives) activated. I installed IPP in /opt/ipp, version 8.1 SP 3.
During cmake, it finds OK IPP libraries, and compiles and installs in /opt/OpenCV with no problem.
When I go to the c examples folder, there's a script that compiles all examples:
$ 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
Now, let's run the script:
$ ./build_all.sh
Every source file gives an output like this:
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
Content of 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
Let's focus in the first not found library (/usr/bin/ld: cannot find -llibsvml.so).
It's in the system: $ 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/intel/composer_xe_2013_sp1.3.174/compiler/lib/mic/libsvml.so
Its folder is in 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
In LIBRARY_PATH too:
$ 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
As far as I can see, the buildAll script relies on pkg-config to find libraries. Noticeable is that these commands return nothing when run:
$ pkg-config --list-all | grep ipp
$ pkg-config --list-all | grep vml
$ dpkg -l | grep ipp
$ dpkg -l | grep vml
Where is gcc looking in during compile:
$ 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/
How can I compile this, so gcc finds IPP libraries?
EDIT 1
I've tried creating a file /etc/ld.so.conf.d/IntelIPP.conf and add there the paths for Intel IPP set in LD_LIBRARY_PATH, restart system and recompile. No effect.
But, I'm guessing about this: "/usr/bin/ld: cannot find -llibsvml.so" should mean that it's looking for a "liblibsvml.so" (ld suffices a "lib" internally to the libraries filenames, I think).
Another point to notice: "gcc -ggdb pkg-config --cflags opencv
-o basename $i .c
$i `pkg-config --libs" executes pkg-config only against opencv, no IPP is named at all. So, it's perhaps some lib location hardcoded by OpenCV during compile or install.
Any clue about this?
EDIT 2
Following this new approach, I've gone to ~/Downloads/openscv-2.4.9/cmake/OpenCVFindIPP.cmake and changed:
# ------------------------------------------------------------------------
# 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()
Recompiled OpenCV and make installed successfully... with no luck. Compiling examples now gives same error, but without "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
Another approach: searching "svml" in /opt/OpenCV/OpenCV-2.4.9/.
This results in 2 files.
/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" )
Shown only lines 211 to 220. Not sure what these lines really mean.
/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}
I think this file is the really interesting one, as far as I Know, it's the file used by pkg-config and ld to load libraries when linking and compiling.
Note this:
Libs: (...) ${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 (..)
I'm still unsure about what to do... -l[xxx] is supposed to load xxx from LD_LIBRARY_PATH, so this should work... any ideas?
Upvotes: 3
Views: 3541
Reputation: 758
Solved it myself.
Edited /opt/OpenCV/OpenCV-2.4.9/lib/pkgconfig/opencv.pc and put this:
# 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}
And now the system doesn't complain about this library.
What surprised me is that in Libs section I tried to use several combos of style -L + -l with no success. (example: -L/opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/intel64 -llibsmvl.so (and -svml)).
So I've decided to put directly folder paths to IPP libraries.
Upvotes: 2