我正在尝试编译this项目(按照给出的说明)。使用rosmake
进行构建时,我得到了一堆undefined reference to cv::String::deallocate()
和undefined reference to cv::String::allocate(unsigned long)
。我很奇怪我在这些函数中遇到错误,而其他OpenCV函数似乎正常工作。
我知道发生这种情况是因为链接器找不到编译这些函数的对象,但我对ROS构建系统并不熟悉,也无法找到错误。
我已尝试使用提供的CMakeLists.txt
文件,并添加了find_package(OpenCV REQUIRED)
和target_link_libraries(xxx xxx ${OpenCV_LIBRARIES})
,但没有任何区别。我知道OpenCV已正确安装和编译(之前我已经使用过),而且我已经安装了ROS而没有任何问题。
我正在使用OpenCV 3,ROS Indigo,Ubuntu 14.04
答案 0 :(得分: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步骤将它们复制到父文件夹中。为了解决这个问题,我只是在使用它的唯一文件中编辑#include(lsd_slam_core / src / IOWrapper / OpenCV / ImageDisplay_OpenCV.cpp)。这似乎解决了它!
我希望这有帮助,如果需要,我可以提供进一步的细节。
答案 1 :(得分:0)
我正在使用OpenCV 3.1.0(出血边缘),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)
答案 2 :(得分:0)
你有多版本的Opencv吗?如果你有,也许你应该将OpenCVConfig.cmake
的路径添加到CmakeList.txt
。就在cmake_minimum_required(VERSION 2.8.12)
下面,就像这样:
set(OpenCV_DIR "/home/ubuntu/src/opencv-3.1.0/build")
就是这样。
答案 3 :(得分:-1)
我也有samme问题。由于缺乏代表,无法评论Osian的解决方案,但这是我使用的程序:
sudo apt-get remove libopencv*
如果由于某种原因从源代码安装了OpenCV,请输入您的构建目录并执行:
sudo make uninstall
然后终于
sudo apt-get install ros-indigo-desktop-full