【问题标题】:opencv3 linking from ROS kinetic来自 ROS 动力学的 opencv3 链接
【发布时间】:2017-08-02 09:52:55
【问题描述】:

全部!

我正在尝试在 CLion 项目中使用 OpenCV 库,但这不成功。我一次安装了带有 ROS 动力学的 opencv 3.2.0(我可以在 /opt/ros/kinetic/include/opencv-3.2.0 目录中看到它,我可以通过 python 导入 cv2)。但是当我使用这样的 CMakeLists.txt 时:

cmake_minimum_required(VERSION 3.6)
project(visual_slam)

set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp)
set(OpenCV_DIR /opt/ros/kinetic/include/opencv-3.2.0)
include_directories( ${OpenCV_DIR})
add_executable(visual_slam ${SOURCE_FILES})

使用下一个简单的代码:

  #include <iostream>
  #include <opencv2/opencv.hpp>

  using namespace cv;

  int main()
  {
      return 0;
  }

我得到下一个错误:

CMakeFiles/visual_slam.dir/main.cpp.o:在函数cv::String::~String()': /opt/ros/kinetic/include/opencv-3.2.0/opencv2/core/cvstd.hpp:664: undefined reference tocv::String::deallocate()' CMakeFiles/visual_slam.dir/main.cpp.o:在函数cv::String::operator=(cv::String const&)': /opt/ros/kinetic/include/opencv-3.2.0/opencv2/core/cvstd.hpp:672: undefined reference tocv::String::deallocate()'

OpenCV linking problems with ROS 中也讨论过此类错误,但是否真的有必要完全卸载然后重新安装 OpenCV?有没有更快捷的解决方案?

第二个问题,如何正确地将OpenCV从ROS添加到CMakeLists.txt?当前的 CMakeLists(见上)看起来并不灵活。我已经尝试添加了

find_package(OpenCV 3 REQUIRED)
target_link_libraries(visual_slam ${OpenCV_LIBRARIES} )

但错误是在 CMake 构建时

 By not providing "FindOpenCV.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "OpenCV",      but
 CMake did not find one.
 Could not find a package configuration file provided 
 by "OpenCV" (requested version 3) with any of the following names:

 OpenCVConfig.cmake
 opencv-config.cmake

【问题讨论】:

    标签: opencv cmake ros clion


    【解决方案1】:

    您得到的第二个错误(即缺少的OpenCV.cmake)实际上不仅与第一个错误(undefined reference to)有关,而且是原因。

    如果cmake 找不到 OpenCV 模块,${OpenCV_LIBS} 不会做任何事情,这意味着target_link_libraries(visual_slam ${OpenCV_LIBRARIES} ) 不会链接到您的代码所需的库。也就是说,我也相信是OpenCV_LIBS 而不是OpenCV_LIBRARIES

    您当然可以指定find_package(...) 命令查找cmake 模块的路径(我认为它是CMAKE_FIND_ROOT_PATH 变量),甚至可以手动指定OpenCV 安装的根文件夹并手动处理所有OpenCV.cmake 为您处理的事情。

    最后但同样重要的是,我不确定 ROS Kinetic 是否使用最新的 OpenCV(您使用的是 v3.2)。你应该检查一下,如果使用了不同的版本(很可能),你将不得不从头开始构建所有与 ROS OpenCV 相关的包。你可能会问“我为什么要这样做?”。好吧,为了避免兼容性问题和可能会或可能不会发生的各种奇怪错误(取决于您使用的 OpenCV 功能),因为 OpenCV 的 X 版本用于 ROS 的二进制包和系统上存在的 Y 版本(使用 X! = Y)。我不得不用 PCL(点云库)做一次,我花了好几天才得出这个结论,因为我得到的错误(对于 C++ 来说是典型的)非常神秘。为避免冲突,请确保您的系统上只有一个版本的 OpenCV(可以通过 cmake 找到)您想要与 ROS 安装一起使用。这也是为什么 ROS 二进制包使用包管理器(OpenCV、PCL 等)解析的依赖项通过 Ubuntu 存储库交付的原因。

    PS:由于我没有使用过Clion,我还建议(在做我上面提到的任何事情之前)检查它是否不是一些隐藏的cmake相关设置IDE 搞砸了。

    【讨论】:

    • 感谢您的回复!如果我从终端启动 Clion,问题就解决了。详情answers.ros.org/question/210534/…
    • 啊,所以问题是 IDE 相关的。顺便说一句,Qt Creator(我使用)也会发生同样的事情。
    猜你喜欢
    • 2016-09-30
    • 1970-01-01
    • 2017-06-30
    • 2015-10-24
    • 2019-01-06
    • 1970-01-01
    • 2020-02-11
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多