链接到从源代码构建的 OpenCV 时出现 Cmake 问题

Posted

技术标签:

【中文标题】链接到从源代码构建的 OpenCV 时出现 Cmake 问题【英文标题】:Cmake issue when linking against OpenCV that is built from source 【发布时间】:2017-11-10 08:50:32 【问题描述】:

我克隆、编译并安装了 OpenCV 的 master 分支:

cmake .. -DCMAKE_INSTALL_PREFIX=/some/non-system-path \ 
         -DCMAKE_BUILD_TYPE=RelWithDebInfo \
         -DCMAKE_INSTALL_RPATH=/some/non-system-path

make
make install

通常的东西,除了我将它安装在用户路径中。为了测试它,我尝试运行以下“hello world”示例:

#include <stdio.h>
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char** argv )

    if ( argc != 2 )
    
        printf("usage: DisplayImage.out <Image_Path>\n");
        return -1;
    
    Mat image;
    image = imread( argv[1], 1 );
    if ( !image.data )
    
        printf("No image data \n");
        return -1;
    
    namedWindow("Display Image", WINDOW_AUTOSIZE );
    imshow("Display Image", image);
    waitKey(0);
    return 0;

使用以下CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project( DisplayImage )
find_package( OpenCV REQUIRED )
include_directories( $OpenCV_INCLUDE_DIRS )
add_executable( DisplayImage main.cpp )
target_link_libraries( DisplayImage $OpenCV_LIBS )

请注意,这是来自 OpenCV 的确切示例。它失败了:

[ 50%] Building CXX object CMakeFiles/DisplayImage.dir/main.cpp.o
make[2]: *** No rule to make target 'opencv_calib3d-NOTFOUND', needed by 'DisplayImage'.  Stop.
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/DisplayImage.dir/all' failed
make[1]: *** [CMakeFiles/DisplayImage.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

查看/some/non-system-path/lib,存在指向libopencv_calib3d.so.3.3.1libopencv_calib3d.so

我认为这可能是link_directories 问题,但是,设置它也没有解决问题。至于$OpenCV_LIBS我打印出来了:

message(STATUS "OpenCV_LIBS = $OpenCV_LIBS")
-- OpenCV_LIBS = opencv_calib3d;opencv_core;opencv_dnn;opencv_features2d;opencv_flann;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_shape;opencv_stitching;opencv_superres;opencv_video;opencv_videoio;opencv_videostab;opencv_viz

有什么想法吗?

【问题讨论】:

嗯。你能grep OpenCV CMakeCache.txt吗?因为我看不到 CMake 从哪里得到opencv_calib3d-NOTFOUND。另外,如果将-DCMAKE_PREFIX_PATH=/some/non-system-path 添加到 CMake 调用中会发生什么? (可以肯定的是,我知道 CMake 应该在 INSTALL_PREFIX 中获取依赖项。) @DevSolar:我猜opencv_calib3d-NOTFOUNDopencv_calib3d IMPORTED 库的“位置”属性。看来,find_package(OpenCV) 脚本(它不应该设置 -NOTFOUND 属性)或 OpenCV 安装有问题。我同意检查 CMakeCache.txt 的 OpenCV 条目可能会有所帮助。 [grepping 不应该是不区分大小写吗?在opencv_calib3d-NOTFOUND 中,第一部分是变量的精确 名称。] @DevSolar,对于“hello world”cmake,我使用正确的 prefix_path 调用它,以便找到 opencv。在 hello world 1 的 CMakeCache 中搜索。 grepping OpenCV 构建的缓存2 【参考方案1】:

我在使用 CMake 在 Windows 10 上使用 Visual Studio 2019 构建 OpenCV 时遇到了这个问题。 x64-Debug 配置构建成功,但x64-Release 出现opencv_calib3d-NOTFOUND 错误。

来自alalek comment的引用:

OpenCV 支持的构建仅限调试和发布。根本不支持其他构建配置,并且不应用正确的编译器标志。

我注意到 CMakeSettings.json 的 RelWithDebInfo 配置类型为 x64-Release。所以我将其更改为Release 配置类型并解决了问题。

P。 S.here也描述了可能的解决方案,但我没有尝试。

【讨论】:

以上是关于链接到从源代码构建的 OpenCV 时出现 Cmake 问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 openCV 库时出现必需品错误

使用 OpenCV 编译时出现 Gtk+ 3 错误

在ARM Docker容器中构建OPENCV时出现问题

使用某些 OpenCV 函数“阈值”Eclipse 时出现链接错误

使用 OpenCV 修复混合 STL 实现

导入opencv时出现Python3重新链接问题