# Groovy and OpenCV: Linker errors

Hi! I'm trying to compile a ROS package in Ubuntu 12.04 64bit which has been used in Fuerte and uses OpenCV. As recommended on the opencv2 ROS Wiki page (http://www.ros.org/wiki/opencv2), I would like to change the way of including OpenCV from the old <depend package="opencv2" /> tag in the manifest.xml. Thus according to the wiki, I changed that entry to <rosdep name="opencv2"/> and edited my CMakeLists.txt to contain

find_package(OpenCV REQUIRED)
#define some target ...
target_link_libraries(my_target ${OpenCV_LIBRARIES}) If I try to build the package with rosmake I get errors during the linking process: Linking CXX executable ../bin/mr ../lib/libmr_lib.so: undefined reference to cv::waitKey(int)' ../lib/libmr_lib.so: undefined reference to cv::imshow(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, cv::_InputArray const&)' ../lib/libmr_lib.so: undefined reference to cvMoveWindow' ../lib/libmr_lib.so: undefined reference to cv::namedWindow(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)' collect2: ld returned 1 exit status make[3]: *** [../bin/mr] Error 1 libopencv2.4-dev is installed. Any help would be very appreciated! Thank you! edit retag close merge delete ## 2 Answers Sort by » oldest newest most voted Thanks a lot for the answer! I've found out that I had an error in my CMakeLists. Not really used to the CMake building procedure... I'm building two libraries and one executable to which the libraries are linked. One of the libs uses OpenCV and I only used one target_link_libraries command to link everything instead of first linking OpenCV to the lib with one command and then linking the lib to the executable with another. So instead of target_link_libraries(my_exec my_lib${OpenCV_LIBS})

I'm now calling

target_link_libraries(my_lib ${OpenCV_LIBS}) target_link_libraries(my_exec my_lib) and it works... more What I did when using opencv was find_package cv_bridge, let catkin depend on it and link against the catkin libraries. It works for me, feel free to down vote this answer if it is not nice ;) find_package(catkin REQUIRED COMPONENTS cv_bridge roscpp) catkin_package( CATKIN_DEPENDS cv_bridge roscpp DEPENDS system_lib ) target_link_libraries(my_node${catkin_LIBRARIES})

Since many libraries will become system dependencies in the long run, this should still work later. In fact I also tried it on a platform where OpenCV was installed outside of ROS and it works

more