CMake - OpenCV - 找不到 -lDisplayImage

Posted

技术标签:

【中文标题】CMake - OpenCV - 找不到 -lDisplayImage【英文标题】:CMake - OpenCV - cannot find -lDisplayImage 【发布时间】:2017-12-07 17:50:00 【问题描述】:

我正在尝试使用Cmake 在 C++ 上使用 opencv 构建一个项目。但是有一个我无法解决的错误。我搜索了很多,但一无所获。

注意: 我是 OpenCV 的初学者。所以我什至不知道为什么需要这个库。只是在网站上做同样的事情。

错误是/usr/bin/ld: cannot find -lDisplayImage

我的code

#include <opencv2/opencv.hpp>

using namespace cv;

int main()

    // read image
    Mat img = imread("foo.jpg", CV_LOAD_IMAGE_UNCHANGED);

    // show it in the window
    imshow("Window Name",img);

    waitKey();

我的CMakeLists.txt

cmake_minimum_required(VERSION 3.8)
project(image_processing)

find_package( OpenCV REQUIRED )

set(CMAKE_CXX_STANDARD 11)

set(SOURCE_FILES main.cpp)
add_executable(image_processing $SOURCE_FILES)
target_link_libraries( image_processing DisplayImage $OpenCV_LIBS )

我的编译输出:

[ 50%] Linking CXX executable image_processing
/usr/bin/ld: cannot find -lDisplayImage
collect2: error: ld returned 1 exit status
CMakeFiles/image_processing.dir/build.make:137: recipe for target 'image_processing' failed
make[3]: *** [image_processing] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/image_processing.dir/all' failed
make[2]: *** [CMakeFiles/image_processing.dir/all] Error 2
CMakeFiles/Makefile2:79: recipe for target 'CMakeFiles/image_processing.dir/rule' failed
make[1]: *** [CMakeFiles/image_processing.dir/rule] Error 2
Makefile:118: recipe for target 'image_processing' failed
make: *** [image_processing] Error 2

ld -ldisplayimage --verbose 命令的输出:

attempt to open //usr/local/lib/x86_64-linux-gnu/libdisplayimage.so failed
attempt to open //usr/local/lib/x86_64-linux-gnu/libdisplayimage.a failed
attempt to open //lib/x86_64-linux-gnu/libdisplayimage.so failed
attempt to open //lib/x86_64-linux-gnu/libdisplayimage.a failed
attempt to open //usr/lib/x86_64-linux-gnu/libdisplayimage.so failed
attempt to open //usr/lib/x86_64-linux-gnu/libdisplayimage.a failed
attempt to open //usr/local/lib64/libdisplayimage.so failed
attempt to open //usr/local/lib64/libdisplayimage.a failed
attempt to open //lib64/libdisplayimage.so failed
attempt to open //lib64/libdisplayimage.a failed
attempt to open //usr/lib64/libdisplayimage.so failed
attempt to open //usr/lib64/libdisplayimage.a failed
attempt to open //usr/local/lib/libdisplayimage.so failed
attempt to open //usr/local/lib/libdisplayimage.a failed
attempt to open //lib/libdisplayimage.so failed
attempt to open //lib/libdisplayimage.a failed
attempt to open //usr/lib/libdisplayimage.so failed
attempt to open //usr/lib/libdisplayimage.a failed
attempt to open //usr/x86_64-linux-gnu/lib64/libdisplayimage.so failed
attempt to open //usr/x86_64-linux-gnu/lib64/libdisplayimage.a failed
attempt to open //usr/x86_64-linux-gnu/lib/libdisplayimage.so failed
attempt to open //usr/x86_64-linux-gnu/lib/libdisplayimage.a failed
ld: cannot find -ldisplayimage

我试图找到那个图书馆,但我找不到。我检查了我所有的 lib 文件夹。

我的 opencv 安装在 /opt/opencv/ 上并构建在 /opt/opencv/release/ 上。

感谢您的帮助。我不知道如何解决它。

【问题讨论】:

您尝试链接的DisplayImage 库是什么,它与OpenCV 有什么关系? 我已经添加了我的代码。 您还没有回答以上问题,我仍然没有看到任何与 OpenCV 相关的错误。您正在尝试链接一些您尚未解释的晦涩库,链接器无法找到该库,并且您的代码显然甚至没有使用该库。 我只是从网站上安装指南。如果没有 DisplayImage,编译器会出错(我不在 linux atm 上,无法编写确切的错误)。我是openCV的初学者。所以我也不知道这个库是什么。 CMakeLists.txt 中删除DisplayImage。看起来它只是跟随 OpenCV demo 的剩余复制粘贴工件。 【参考方案1】:

当您在没有很好理解示例的情况下复制和粘贴示例时,就会发生这种情况。问题出在 CMakeLists.txt

你有

cmake_minimum_required(VERSION 3.8)
project(image_processing)

find_package( OpenCV REQUIRED )

set(CMAKE_CXX_STANDARD 11)

set(SOURCE_FILES main.cpp)
add_executable(image_processing $SOURCE_FILES)
target_link_libraries( image_processing DisplayImage $OpenCV_LIBS )

我将在这里一行一行地介绍。首先它会检查您是否拥有最低 cmake 版本(以确保之后的某些功能有效),然后显然是项目的名称,它可以是您想要的任何名称。然后你会找到 OpenCV 库,它会设置几个变量(包括、库等)。然后你设置c++11标准和你的源文件,在这种情况下,这个可执行文件只有1(你可以放尽可能多的,如果需要的话,和.h一样)。

最后是重要的部分,add_executable,您传递 2 个参数、可执行文件的名称(可以是任何名称)和源文件...您甚至可以手动编写源文件,而不是先将它们设置为变量。之后你说哪些库将链接到你的可执行文件......这是你有错误的地方!您必须将之前声明的可执行文件的名称作为第一个参数,然后是使用的库。当您执行find_package(OpenCV REQUIRED) 时,它将库名称设置在$(OpenCV_LIBS) 变量中。如果您需要另一个库,您可以手动输入名称,它会在编译时链接它。在这种情况下,您有名称 DisplayImage,它认为这是一个库名称并尝试链接它,这意味着在编译时 -lDisplayImage

这意味着你删除它并且它应该编译:)

target_link_libraries( image_processing  $OpenCV_LIBS )

另外,在找到 OpenCV 包后,我建议你这样做

include_directories( $OpenCV_INCLUDE_DIRS )

这将确保将包含文件夹添加到编译中。在 gcc 中等效于 -Ifolder/path 选项。如果你必须包含来自不同库项目的更多文件夹,你可以使用这个命令。

希望对你有帮助。

【讨论】:

哦.. 感谢您的精彩评论。 @Zaphiel 我一直认为不解释就给出解决方案会在未来导致同样的错误,但如果你理解了问题就不会再发生了:)

以上是关于CMake - OpenCV - 找不到 -lDisplayImage的主要内容,如果未能解决你的问题,请参考以下文章

cmake 找不到“OPENCV”提供的包配置文件

CMake 问题 - 找不到“OpenCV”提供的包配置文件

魔改Cmake系列:编译caffe的时候找不到OpenCV

魔改Cmake系列:编译caffe的时候找不到OpenCV

C++ OpenCV 包含错误“找不到文件”

用于 openCV 的 CMake