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