链接到从源代码构建的 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.1
的libopencv_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-NOTFOUND
是opencv_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 问题的主要内容,如果未能解决你的问题,请参考以下文章