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

0、问题

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

只是想尝试使用CMake编译。

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

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

这样写后,

mkdir build
cd build
cmake ..

到这是没有任何问题的。

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

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

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

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

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

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

1、解决方法一

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

例如CMakeLists.txt文件这样写:

cmake_minimum_required(VERSION 3.16)
project(CPPOPCVDEMO)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O2 -Wall")
set(CMAKE_BUILD_TYPE Debug)
# !!!
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)
# !!!
include_directories(/usr/local/include/opencv4)
# !!!
link_directories(/usr/local/lib)
add_executable(OpcvMain CppOpcvDemo0.cpp)
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需要先编译:

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

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

但这个时候不用安装。

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

cmake_minimum_required(VERSION 3.16)
project(CPPOPCVDEMO)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O2 -Wall")
set(CMAKE_BUILD_TYPE Debug)
# !!!
set(OpenCV_DIR /opt/opencv-4.5.1/build)
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(OpcvMain CppOpcvDemo0.cpp)
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本身很庞大,我一个人折腾了两天,算是勉强解决了自己遇到的问题,但是还是不明所以,希望懂的人能给我讲一讲啊!谢谢!!!

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值