2015-04-06 115 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") 

就這樣。