从 ROS kinetic 链接的 opencv3
opencv3 linking from ROS kinetic
所有!
我正尝试在 CLion 项目中使用 OpenCV 库,但未成功。我立即安装了带有 ROS kinetic 的 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: In function 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: In function 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
您遇到的第二个错误(即缺少 OpenCV.cmake
)实际上不仅与第一个错误(undefined reference to
)有关,而且是原因。
如果 cmake
找不到 OpenCV 模块,${OpenCV_LIBS}
将不会做任何事情,这意味着 target_link_libraries(visual_slam ${OpenCV_LIBRARIES} )
不会 link 针对您的代码所需的库.那就是说我也相信它是 OpenCV_LIBS
而不是 OpenCV_LIBRARIES
.
您当然可以指定 find_package(...)
命令寻找 cmake
模块的路径(我认为是 CMAKE_FIND_ROOT_PATH
变量),甚至可以手动指定根文件夹您的 OpenCV 安装并手动处理 OpenCV.cmake
为您处理的所有事情。
最后但同样重要的是,我不确定 ROS Kinetic 是否使用最新的 OpenCV(您使用的是 v3.2)。你应该检查一下,如果使用了不同的版本(很有可能),你将不得不从头开始构建所有与 ROS OpenCV 相关的包。你可能会问 "Why should I do that?"。好吧,为了避免由于 OpenCV 的 X 版本用于 ROS 的二进制包和系统上存在的 Y 版本(带有 X ! = Y)。我不得不用 PCL(点云库)来做一次,我花了几天时间才得出这个结论,因为我得到的错误(C++ 的典型错误)非常神秘。为避免冲突,请确保您的系统中只有一个版本的 OpenCV(可以通过 cmake
找到),您希望在 ROS 安装中使用该版本。这也是为什么 ROS 二进制包使用包管理器(OpenCV、PCL 等)解析的依赖项通过 Ubuntu 存储库传送的原因。
PS: 因为我还没有使用 Clion
我也建议(在做我上面提到的任何事情之前)检查它是否是不是 IDE 中一些隐藏的 cmake
相关设置搞砸了。
所有!
我正尝试在 CLion 项目中使用 OpenCV 库,但未成功。我立即安装了带有 ROS kinetic 的 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: In function
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: In functioncv::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
您遇到的第二个错误(即缺少 OpenCV.cmake
)实际上不仅与第一个错误(undefined reference to
)有关,而且是原因。
如果 cmake
找不到 OpenCV 模块,${OpenCV_LIBS}
将不会做任何事情,这意味着 target_link_libraries(visual_slam ${OpenCV_LIBRARIES} )
不会 link 针对您的代码所需的库.那就是说我也相信它是 OpenCV_LIBS
而不是 OpenCV_LIBRARIES
.
您当然可以指定 find_package(...)
命令寻找 cmake
模块的路径(我认为是 CMAKE_FIND_ROOT_PATH
变量),甚至可以手动指定根文件夹您的 OpenCV 安装并手动处理 OpenCV.cmake
为您处理的所有事情。
最后但同样重要的是,我不确定 ROS Kinetic 是否使用最新的 OpenCV(您使用的是 v3.2)。你应该检查一下,如果使用了不同的版本(很有可能),你将不得不从头开始构建所有与 ROS OpenCV 相关的包。你可能会问 "Why should I do that?"。好吧,为了避免由于 OpenCV 的 X 版本用于 ROS 的二进制包和系统上存在的 Y 版本(带有 X ! = Y)。我不得不用 PCL(点云库)来做一次,我花了几天时间才得出这个结论,因为我得到的错误(C++ 的典型错误)非常神秘。为避免冲突,请确保您的系统中只有一个版本的 OpenCV(可以通过 cmake
找到),您希望在 ROS 安装中使用该版本。这也是为什么 ROS 二进制包使用包管理器(OpenCV、PCL 等)解析的依赖项通过 Ubuntu 存储库传送的原因。
PS: 因为我还没有使用 Clion
我也建议(在做我上面提到的任何事情之前)检查它是否是不是 IDE 中一些隐藏的 cmake
相关设置搞砸了。