【发布时间】:2017-12-06 16:47:50
【问题描述】:
大家好,我正在尝试在 wxDev C++ 中使用 OpenCV 库,但无法正确编译。 (OpenCV 版本:2.4.13.4)
这些是错误:
[Linker Error] undefined reference to `cvLoadImage'
[Linker Error] undefined reference to `cvShowImage'
[Linker Error] undefined reference to `cvWaitKey'
[Linker Error] undefined reference to `cvReleaseImage'
ld returned 1 exit status
这些是代码:
#include "opencv2/opencv.hpp"
int main()
{
IplImage *srcImg = NULL;
srcImg = cvLoadImage( "temp.jpg", 1);
if( srcImg == NULL ){
return -1;
}
cvShowImage( "Source", srcImg );
cvWaitKey(0);
cvReleaseImage( &srcImg );
}
这些是 wxDev 的设置: wxDev Compiler Options
wxDev 似乎无法识别我从库中包含的那些方法。我该怎么办?
//--------------------------------------------- ----------------------------------
[12/4 更新] 我忘了说我也尝试过使用不同版本的 OpenCV(3.3.1),所以截图中的设置有一点错误。 “D:\OpenCV\2.4\opencv\build”适用于 2.4.13.4。 “D:\OpenCV\opencv\build”适用于 3.3.1。我已将它们都包含在设置中,但仍然无法解决。我不知道 3.3.1 和 2.4.1.3 有什么区别,但它们是最新的更新。
我尝试更改命名库的方式,但没有奏效。例如,“-opencv_core”、“-lopencv_core”、“-opencv_core.lib”、“-lopencv_core.lib”、“-lopencv_core.a”。
//--------------------------------------------- ----------------------------------
[12/5 更新#1] 库似乎有问题。因此,我没有使用较新版本的 OpenCV,而是尝试使用较旧的 OpenCV2.2。幸运的是,它工作得很好!我做了完全相同的事情,但得出了不同的结果。我认为该软件的方法已在最新版本中以某种方式进行了修改。希望有人可以为最新版本的 OpenCV 提供后续教程。
[12/5 更新#2] 成功编译这个程序后,我开始运行另一个 OpenCV 示例。发生了同样的问题。
示例代码:
#include <cstdio>
#include <opencv2/opencv.hpp>
using namespace cv;
int main(){
Mat img = imread("lena.jpg",CV_LOAD_IMAGE_GRAYSCALE);
imwrite("output.jpg",img);
namedWindow("Display window", WINDOW_AUTOSIZE);
imshow("Display window", img);
waitKey(0);
return 0;
}
其中一些错误:
[Linker Error] undefined reference to `cv::imread(std::string const&, int)
[Linker Error] undefined reference to `cv::namedWindow(std::string const&, int)
[Linker Error] undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)
[Linker Error] undefined reference to `cv::fastFree(void*)'
同样的问题不断发生,仍在寻找救星。
//--------------------------------------------- ----------------------------------
[12/6 更新] 经过几次尝试,我将 OpenCV 降级到 2.0 版本。该程序成功运行。与其他版本相比,唯一的区别是所包含的库的方向。
如果我写#include <opencv2/opencv.hpp>,其他版本将无法使用。
如果我写#include <cv.h>, #include <highgui.h>,2.0 版就可以使用。
(2.0 版没有文件opencv2,所以我必须包含方向。)我不知道为什么会这样。
解决方法是使用 2.0 版本,同时不使用#include <opencv2/opencv.hpp>。到目前为止,它在大多数示例中都可以很好地运行。虽然我现在可以开始我的项目,但我仍然试图弄清楚如何使用最新版本的 OpenCV。
//--------------------------------------------- ----------------------------------
回复 Mark Setchell- 这些是到目前为止的文件和设置的屏幕截图:
The lib files and its directions
OpenCV 2.2.0 settings and directions
OpenCV 2.4.11 settings and directions
我试过不同版本的OpenCV来运行程序,过程的细节写在“12/5 update”中。顺便说一句,我确实在运行程序之前更改了编译器。感谢您的帮助!
【问题讨论】:
-
这是一个典型的错误,当您没有正确链接库文件或者您的 OpenCV 编译没有正确完成时。我可能错了,但您似乎使用 MinGW 作为编译器,但尝试使用为 Visual Studio 编译的 OpenCV。
-
感谢您的回复。我不确定我是否明白你的意思,但我在这个项目中使用的是 wxDev C++,而不是 Visual Studio。老实说,我不知道 MinGW 是做什么用的,它是默认设置。
-
你的库文件不能有文件扩展名.lib,它应该是.a。如果您使用的是 Visual Studio,则可以使用 .lib。
-
我不知道 wxDev++ 但在其他地方你可能会使用
-lopencv_core或-llibopencv_core或-lopencv_core.a等。 -
好的,那我试试看!