赞
踩
在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文件中,对库目录及其路径有配置错误的可能。
不使用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个库的名字)
这个个方法,就是不使用安装的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})
这两种方法目前清测都可以解决问题,成功编译。
但是有个小细节,在使用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
Opencv本身很庞大,我一个人折腾了两天,算是勉强解决了自己遇到的问题,但是还是不明所以,希望懂的人能给我讲一讲啊!谢谢!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。