当前位置:   article > 正文

[踩坑]【没有规则可制作目标“opencv_calib3d-NOTFOUND”...】「C++学习笔记」Linux上使用CMake编译Opencv项目时的问题解决。_没有规则可制作目标“/home/kai/opencv-4.2.0/build/lib/libopen

没有规则可制作目标“/home/kai/opencv-4.2.0/build/lib/libopencv_gapi.so.4.2.0

0、问题

在Linux上写了一个很简单的打开图片并显示的程序。

只是想尝试使用CMake编译。

但是,按照官方以及很多人的方法

  1. cmake_minimum_required(VERSION 3.16)
  2. project(CPPOPCVDEMO)
  3. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O2 -Wall")
  4. set(CMAKE_BUILD_TYPE Debug)
  5. # 找到opencv的位置
  6. find_package(OpenCV REQUIRED)
  7. # 包含目录
  8. include_directories(${OpenCV_INCLUDE_DIRS})
  9. add_executable(OpcvMain CppOpcvDemo0.cpp)
  10. # 链接库
  11. target_link_libraries(OpcvMain ${OpenCV_LIBS})

这样写后,

  1. mkdir build
  2. cd build
  3. cmake ..

到这是没有任何问题的。

但是接着  make  ,就会报错【没有规则可制作目标“opencv_calib3d-NOTFOUND”...】:

百度谷歌上找了很久,发现碰到这个问题的不在少数,但是具体将明白的没看到。

通过翻看各类大仙的争论和建议,加上自己的尝试,

目前我怀疑是OpenCV的安装过程中有遗漏某些步骤,也可能是OpenCV本身就有bug,

使得CMakeLists.txt中,find_package()这一步找到的Opencv的相关配置有问题。

我感觉应该是安装完OpenCV后的OpenCVConfig.cmake文件中,对库目录及其路径有配置错误的可能。

1、解决方法一

不使用find_package()函数,而是直接给路径,

例如CMakeLists.txt文件这样写:

  1. cmake_minimum_required(VERSION 3.16)
  2. project(CPPOPCVDEMO)
  3. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O2 -Wall")
  4. set(CMAKE_BUILD_TYPE Debug)
  5. # !!!
  6. set(OpenCV_LIBS opencv_calib3d;opencv_core;opencv_dnn;opencv_features2d;opencv_flann;opencv_gapi;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_stitching;opencv_video;opencv_videoio)
  7. # !!!
  8. include_directories(/usr/local/include/opencv4)
  9. # !!!
  10. link_directories(/usr/local/lib)
  11. add_executable(OpcvMain CppOpcvDemo0.cpp)
  12. target_link_libraries(OpcvMain ${OpenCV_LIBS})

说明以下,里面set(OpenCV_LIBS opencv_ca……),后面那一串从那来呢

一般安装了(make install)OpenCV后,在“/usr/local/lib/cmake/opencv4”路径下,可以找到OpenCVConfig.cmake文件。

打开OpenCVConfig.cmake文件,查找“OpenCV_LIB_COMPONENTS”,我这里在108行,可以找到这(大概15个库的名字)

 

2、方法二

这个个方法,就是不使用安装的OpenCV,而是使用没安装的。

下载的OpenCV源码,将源码复制到固定目录,例如我的在 /opt/opencv-4.5.1/下

通常情况下,安装Opencv需要先编译:

  1. cd <path of opencv-x.x.x source code>
  2. mkdir build
  3. cd build
  4. # cmake ..步骤中参数,请自行定夺。
  5. cmake -D CMAKE_BUILD_TYPE=Release/Debug -D OPENCV_GENERATE_PKGCONFIG=ON BUILD_EXAMPLES -D CMAKE_INSTALL_PREFIX=/usr/local ..
  6. make -j7

正常到这一部,接下来就是make install,就可以安装OpenCV了。

但这个时候不用安装。

这个时候,自己项目的CMakeLists.txt文件这样写:

  1. cmake_minimum_required(VERSION 3.16)
  2. project(CPPOPCVDEMO)
  3. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O2 -Wall")
  4. set(CMAKE_BUILD_TYPE Debug)
  5. # !!!
  6. set(OpenCV_DIR /opt/opencv-4.5.1/build)
  7. find_package(OpenCV REQUIRED)
  8. include_directories(${OpenCV_INCLUDE_DIRS})
  9. add_executable(OpcvMain CppOpcvDemo0.cpp)
  10. target_link_libraries(OpcvMain ${OpenCV_LIBS})

3、尾巴

这两种方法目前清测都可以解决问题,成功编译。

但是有个小细节,在使用VSCode开发的时候,为了有智能提示,会将opencv的include路径加到c_cpp_properties.json文件中。

使用方法一,或者说正常安装了opencv时,所有头文件都在同一个目录:/usr/local/include/opencv4。

而如果使用第二种方法,不安装Opencv,各模块头文件的位置可以从OpenCV_INCLUDE_DIRS中看到:

/opt/opencv-4.5.1/build;

/opt/opencv-4.5.1/include;
/opt/opencv-4.5.1/modules/core/include;
/opt/opencv-4.5.1/modules/flann/include;
/opt/opencv-4.5.1/modules/imgproc/include;
/opt/opencv-4.5.1/modules/ml/include;
/opt/opencv-4.5.1/modules/photo/include;
/opt/opencv-4.5.1/modules/dnn/include;
/opt/opencv-4.5.1/modules/features2d/include;
/opt/opencv-4.5.1/modules/imgcodecs/include;
/opt/opencv-4.5.1/modules/videoio/include;
/opt/opencv-4.5.1/modules/calib3d/include;
/opt/opencv-4.5.1/modules/highgui/include;
/opt/opencv-4.5.1/modules/objdetect/include;
/opt/opencv-4.5.1/modules/stitching/include;
/opt/opencv-4.5.1/modules/ts/include;
/opt/opencv-4.5.1/modules/video/include;
/opt/opencv-4.5.1/modules/gapi/include

4、恳请哪位大佬如果比较清除这个问题的根源,有更好的解决办法的话,麻烦告知。

Opencv本身很庞大,我一个人折腾了两天,算是勉强解决了自己遇到的问题,但是还是不明所以,希望懂的人能给我讲一讲啊!谢谢!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/100598
推荐阅读
相关标签
  

闽ICP备14008679号