所有!
我正在尝试在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 to
cv :: 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 to
cv :: String :: deallocate()'
OpenCV linking problems with ROS中也讨论过这样的错误,但完全卸载然后再安装OpenCV真的有必要吗?还有更快的解决方案吗?
第二个问题,如何正确地将ROS从OpenCV添加到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
答案 0 :(得分:0)
你得到的第二个错误(即缺失的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相关的软件包。您可能会问&#34;我为什么要这样做?&#34;。好吧,为了避免兼容性问题和可能会或可能不会发生的各种奇怪错误(取决于您使用的OpenCV功能),因为OpenCV的X版本被用于系统上存在的ROS和版本Y的二进制包(使用X! = Y)。我不得不用PCL(Point Cloud Library)做过一次,因为我得到的错误(对于C ++来说很典型)很神秘,所以我花了好几天才得出这个结论。为避免冲突,请确保您的系统上只存在一个版本的OpenCV(可由cmake
找到),以便与ROS安装一起使用。这也是为什么ROS二进制包使用由包管理器(OpenCV,PCL等)解析的依赖关系通过Ubuntu repos发布的原因。
PS:由于我还没有使用Clion
我还建议(在做上述任何事情之前)检查它是否不是IDE中的一些隐藏的cmake
相关设置会搞砸了。