2015-05-27 7 views
0

Я пытаюсь написать ROS-узел, который использует незащищенные компоненты OpenCV (SURF). У меня есть проблемы компиляции пакета с помощью catkin_make:undefined reference to ... при компиляции ros node

//usr/local/lib/libopencv_nonfree.so: undefined reference to `cv::ocl::integral(cv::ocl::oclMat const&, cv::ocl::oclMat&)' 

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3) 
project(homography_test) 

## Find catkin macros and libraries 
## is used, also find other catkin packages 
find_package(catkin REQUIRED COMPONENTS 
    roscpp 
    rospy 
    std_msgs 
    sensor_msgs 
    cv_bridge 
    image_transport 
) 

catkin_package(

) 

########### 
## Build ## 
########### 

## Specify additional locations of header files 
## Your package locations should be listed before other locations 
# include_directories(include) 
include_directories(
    ${catkin_INCLUDE_DIRS} 
    /usr/local/include 
    /usr/include 
    /usr/include/gstreamer-1.0 
    /usr/include/glib-2.0 
    /usr/lib/x86_64-linux-gnu/glib-2.0/include 
) 

## Declare a cpp executable 
#add_executable(display_image src/display_image_node.cpp) 
add_executable(homography src/sample.cpp) 

## Add cmake target dependencies of the executable/library 
## as an example, message headers may need to be generated before nodes 
#add_dependencies(homography_test homography_test_generate_messages_cpp) 

## Specify libraries to link a library or executable target against 
target_link_libraries(
    homography 

    ${catkin_LIBRARIES} 

    gstreamer-1.0 
    gobject-2.0 
    glib-2.0 

    opencv_nonfree 
    opencv_calib3d 
    opencv_contrib 
    opencv_core 
    opencv_features2d 
    opencv_flann 
    opencv_gpu 
    opencv_highgui 
    opencv_imgproc 
    opencv_legacy 
    opencv_ml 
    opencv_objdetect 
    opencv_ocl 
    opencv_photo 
    opencv_stitching 
    opencv_superres 
    opencv_ts 
    opencv_video 
    opencv_videostab 
    rt 
    pthread 
    m 
    dl 
) 

link_directories(/usr/local/lib) 

Но если я вручную скомпилировать один и тот же код, но не как РОС-узел, все работает.

+0

вы должны отредактировать свой пост, добавив хотя бы «CMakeList.txt», но посмотрите [здесь] (http://stackoverflow.com/questions/26553659/linking-opencv-nonfree-components-sift-features -and-ocl-specific). – alextoind

+0

Я уже прочитал этот пост, но это мне не помогло. – user4276305

+0

Что представляет собой линия компиляции, когда вы добавляете VERBOSE = 1 к вашему исполнению? – donjuedo

ответ

2

похоже, что библиотека opencv_ocl не связана должным образом. Кроме того, вы можете упростить свой файл CMakeLists.txt, используя find_package, чтобы получить конфигурацию OpenCV. Попробуйте добавить эти строки в файл CMakeLists.txt:

find_package(OpenCV REQUIRED core ocl) 
include_directories(SYSTEM ${OpenCV_INCLUDE_DIRS}) 
target_link_libraries(homography ${catkin_LIBRARIES} ${OpenCV_LIBRARIES}) 

Вы должны указать, какие библиотеки OpenCV вы хотите включить в find_package. Я перечислял только core и ocl, так как ocl кажется тем, что вам нужно, но другие могут понадобиться.