2015-04-06 168 views
2

我想编译this项目(按照给出的说明)。当用rosmake构建它时,我得到一堆undefined reference to cv::String::deallocate()undefined reference to cv::String::allocate(unsigned long)。我感到好奇,只是在这些函数中出现错误,而其余的OpenCV函数似乎正常工作。OpenCV链接问题与ROS

我知道发生这种情况是因为链接器找不到这些函数编译到的对象,但我对ROS构建系统很陌生,无法找到问题所在。

我已经使用所提供的CMakeLists.txt文件,并且还加入find_package(OpenCV REQUIRED)target_link_libraries(xxx xxx ${OpenCV_LIBRARIES}),而没有做出任何区别尝试。我知道OpenCV的安装和编译是正确的(我之前使用过),并且我已经安装了ROS,没有任何问题。

我使用OpenCV的3,ROS靛蓝,Ubuntu的14.04

回答

4

我有此相同的问题 - 同样的错误信息,同样的设置。我已经设法解决了这个问题,但我并不完全确定我所做的实际贡献的步骤。据我所知,这是由于OpenCV版本的冲突 - 我认为我有旧版本的OpenCV凌乱我的/ usr/include和/ usr/local。我卸载了所有OpenCV软件包(包括ROS软件包),并包括我的OpenCV3源代码安装(也位于/ usr/local)。然后,我安装了ROS软件包vision_opencv,它似乎安装了OpenCV 2.4.8(顺便说一下,LSD SLAM推荐的软件包)。当然,如果你需要OpenCV3来做其他事情,这可能会很麻烦,但是现在我已经把它作为本地安装在我的主目录中了(我无法弄清楚如何让ROS连接到这个目录)。

我认为这解决了问题,剩下的唯一问题是我得到的错误消息说没有找到。这是因为软件包安装将其保留(对于所有模块包含文件类似),而源安装的make install步骤将它们复制到父文件夹中。为了解决这个问题,我简单地编辑了它使用的唯一文件(lsd_slam_core/src/IOWrapper/OpenCV/ImageDisplay_OpenCV.cpp)中的#include。这似乎解决了它!

我希望这可以帮助,如果需要,我可以提供进一步的细节。

0

我也有samme问题。无法发表评论Osian的解决方案由于缺乏代表的,但这是我所使用的程序:

sudo apt-get remove libopencv* 

如果你因为某些原因已经从源代码安装OpenCV中,输入你的build目录并执行:

sudo make uninstall 

Then finally

sudo apt-get install ros-indigo-desktop-full 
0

我使用的是OpenCV 3.1.0(Bleeding edge),ROS Indigo,Ubuntu 14.04。 我试图编译LSD-SLAM

时跑了类似的麻烦我说:

find_package(OpenCV 3.1.0 REQUIRED COMPONENTS core highgui imgproc imgcodecs) 

我还添加了OpenCV的库目标链接库:

target_link_libraries(lsdslam ${FABMAP_LIB} g2o_core g2o_stuff csparse cxsparse g2o_solver_csparse g2o_csparse_extension g2o_types_sim3 g2o_types_sba X11 opencv_core opencv_imgproc opencv_highgui opencv_imgcodecs) 

这是我CMakeLists。txt文件:

cmake_minimum_required(VERSION 2.8.12) 
project(lsd_slam_core) 
include($ENV{ROS_ROOT}/core/rosbuild/rosbuild.cmake) 
find_package(OpenCV 3.1.0 REQUIRED COMPONENTS core highgui imgproc imgcodecs) 

# Set the build type. Options are: 
# Coverage  : w/ debug symbols, w/o optimization, w/ code-coverage 
# Debug   : w/ debug symbols, w/o optimization 
# Release  : w/o debug symbols, w/ optimization 
# RelWithDebInfo : w/ debug symbols, w/ optimization 
# MinSizeRel  : w/o debug symbols, w/ optimization, stripped binaries 
set(ROS_BUILD_TYPE Release) 

rosbuild_init() 

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) 
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) 
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH}) 

find_package(Eigen3 REQUIRED) 
find_package(SuiteParse REQUIRED) # Apparently needed by g2o 
find_package(X11 REQUIRED) 

# FabMap 
# uncomment this part to enable fabmap 
#add_subdirectory(${PROJECT_SOURCE_DIR}/thirdparty/openFabMap) 
#include_directories(${PROJECT_SOURCE_DIR}/thirdparty/openFabMap/include) 
#add_definitions("-DHAVE_FABMAP") 
#set(FABMAP_LIB openFABMAP) 

# Dynamic Reconfigure Services 
rosbuild_find_ros_package(dynamic_reconfigure) 
include(${dynamic_reconfigure_PACKAGE_PATH}/cmake/cfgbuild.cmake) 
gencfg() 

# SSE flags 
rosbuild_check_for_sse() 
add_definitions("-DUSE_ROS") 
add_definitions("-DENABLE_SSE") 

# Also add some useful compiler flag 
set(CMAKE_CXX_FLAGS 
    "${CMAKE_CXX_FLAGS} ${SSE_FLAGS} -march=native -std=c++0x" 
) 

# Set source files 
set(lsd_SOURCE_FILES 
    ${PROJECT_SOURCE_DIR}/src/DataStructures/Frame.cpp 
    ${PROJECT_SOURCE_DIR}/src/DataStructures/FramePoseStruct.cpp 
    ${PROJECT_SOURCE_DIR}/src/DataStructures/FrameMemory.cpp 
    ${PROJECT_SOURCE_DIR}/src/SlamSystem.cpp 
    ${PROJECT_SOURCE_DIR}/src/LiveSLAMWrapper.cpp 
    ${PROJECT_SOURCE_DIR}/src/DepthEstimation/DepthMap.cpp 
    ${PROJECT_SOURCE_DIR}/src/DepthEstimation/DepthMapPixelHypothesis.cpp 
    ${PROJECT_SOURCE_DIR}/src/util/globalFuncs.cpp 
    ${PROJECT_SOURCE_DIR}/src/util/SophusUtil.cpp 
    ${PROJECT_SOURCE_DIR}/src/util/settings.cpp 
    ${PROJECT_SOURCE_DIR}/src/util/Undistorter.cpp 
    ${PROJECT_SOURCE_DIR}/src/Tracking/Sim3Tracker.cpp 
    ${PROJECT_SOURCE_DIR}/src/Tracking/Relocalizer.cpp 
    ${PROJECT_SOURCE_DIR}/src/Tracking/SE3Tracker.cpp 
    ${PROJECT_SOURCE_DIR}/src/Tracking/TrackingReference.cpp 
    ${PROJECT_SOURCE_DIR}/src/IOWrapper/Timestamp.cpp 
    ${PROJECT_SOURCE_DIR}/src/GlobalMapping/FabMap.cpp 
    ${PROJECT_SOURCE_DIR}/src/GlobalMapping/KeyFrameGraph.cpp 
    ${PROJECT_SOURCE_DIR}/src/GlobalMapping/g2oTypeSim3Sophus.cpp 
    ${PROJECT_SOURCE_DIR}/src/GlobalMapping/TrackableKeyFrameSearch.cpp 
) 
set(SOURCE_FILES 
    ${lsd_SOURCE_FILES} 
    ${PROJECT_SOURCE_DIR}/src/IOWrapper/ROS/ROSImageStreamThread.cpp 
    ${PROJECT_SOURCE_DIR}/src/IOWrapper/ROS/ROSOutput3DWrapper.cpp 
    ${PROJECT_SOURCE_DIR}/src/IOWrapper/OpenCV/ImageDisplay_OpenCV.cpp 
) 

include_directories(
    ${EIGEN3_INCLUDE_DIR} 
    ${PROJECT_SOURCE_DIR}/src 
    ${PROJECT_SOURCE_DIR}/thirdparty/Sophus 
    ${CSPARSE_INCLUDE_DIR} #Has been set by SuiteParse 
    ${CHOLMOD_INCLUDE_DIR} #Has been set by SuiteParse 
) 

# build shared library. 
rosbuild_add_library(lsdslam SHARED ${SOURCE_FILES}) 
target_link_libraries(lsdslam ${FABMAP_LIB} g2o_core g2o_stuff csparse cxsparse g2o_solver_csparse g2o_csparse_extension g2o_types_sim3 g2o_types_sba X11 opencv_core opencv_imgproc opencv_highgui opencv_imgcodecs) 
rosbuild_link_boost(lsdslam thread) 


# build live ros node 
rosbuild_add_executable(live_slam src/main_live_odometry.cpp) 
target_link_libraries(live_slam lsdslam) 


# build image node 
rosbuild_add_executable(dataset_slam src/main_on_images.cpp) 
target_link_libraries(dataset_slam lsdslam) 
+0

因此,随着您所做的改变,它终于起作用了吗? – kensai

0

你有多个版本的Opencv?如果有的话,也许你应该将路径OpenCVConfig.cmake加入CmakeList.txt。就在cmake_minimum_required(VERSION 2.8.12)之下,就像这样:

set(OpenCV_DIR "/home/ubuntu/src/opencv-3.1.0/build") 

就这样。