ubuntu下cmake设置opencv链接库

问题描述:

问题1:
在编译视觉SLAM十四讲第九讲的时候,出现如下错误: undefined reference to cv::String::allocate(unsigned long)' CMakeFiles/run_vo.dir/run_vo.cpp.o: In functioncv::Mat::~Mat()’:.详细错误如下图:ubuntu下cmake设置opencv链接库_第1张图片通过搜索发现是由于opencv的版本不对造成的,我的系统中有两个opencv版本,一个为ROS系统自带的和自己源码编译的opencv3.1,而CMakeLists.txt中采用的find_package(OpenCV REQUIRED)查找的是ROS系统自带的opencv(具体版本号已忘记了),所以考虑在CMakeLists.txt中创建源码编译的opencv3.1的静态连接.

问题2:
通过建立opencv3.1的静态连接后解决了上述问题,再次编译,又出现:Could NOT find CUDA: Found unsuitable version “7.5”, but required is exact version “8.0” (found /usr)的报错,这是由于我系统安装了两个cuda版本cuda7.5和cuda8,系统默认的软链接为cuda7.5.而错误提示需要用cuda8.0.为了不破坏系统原有的软链接,考虑直接在cmake过程中链接cuda8.0.
ubuntu下cmake设置opencv链接库_第2张图片

解决方法:

问题1:
第一步:查找OpenCVConfig.cmake的地址.

locate OpenCVConfig.cmake

原理:由于CMakeLists中的find_package(OpenCV REQUIRED)会在Ubuntu系统中找到OpenCVConfig.cmake,该文件中包含了OpenCV_INCLUDE_DIRS和OpenCV_LIBS 等变量,从而通过 include_directories和target_link_libraries来访问这两个变量。所以找到源码编译的opencv3.1中的OpenCVConfig.cmake地址.
ubuntu下cmake设置opencv链接库_第3张图片
第二步:修改CMakeLists中opencv的软链接.

set(OpenCV_DIR /home/canfly/Downloads/opencv-3.1.0/build/) //设置OpenCVConfig.cmake的地址
find_package(OpenCV REQUIRED) //在设置的地址下,查找opencv
include_directories(${OPENCV_INCLUDE_DIRS}) //添加引用目录

原理:在cmake中设置opencv的查找地址为源码编译的新地址,从而可以继续使用CMakeLists原来的find_package()等函数.

第三步:重新cmake和make

cmake ..
make

到此,第一个问题opencv的问题解决爆出第二个cuda版本不对的问题.
解决思路就是连接正确的cuda版本地址.

问题2:
具体解决原理参考第3个链接, 具体步骤直接上代码:

cat /usr/local/cuda/version.txt  //查询cuda版本
cmake -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-8.0 .. //原理参考连接3
make

ubuntu下cmake设置opencv链接库_第4张图片最终编译通过.第一次发帖,没啥经验,为了和大家分享核存档留着以后遇见类似问题不用再到处收集资料浪费时间了!

总结:

本问题主要集中在如何在CMakeLists.txt中设置opencv的软链接.通过类似方法,对于eigen,ceres和g2o等第三方软件都可以直接设置对应的链接地址.不用在纠结到底软件装在哪了.

参考:

  1. Ubuntu中使用cmake链接opencv库的两种方法
  2. ubuntu16.04查看opencv安装路径以及版本号
  3. cmake error: Could NOT find CUDA-unsuitable version “8.0”,but required is exact version “9.0”

你可能感兴趣的:(opencv)