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的主要内容,如果未能解决你的问题,请参考以下文章