【问题标题】:wxDEV+OpenCV error : Undefined reference to `cvLoadImage''wxDEV+OpenCV 错误:未定义对“cvLoadImage”的引用
【发布时间】: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 &lt;opencv2/opencv.hpp&gt;,其他版本将无法使用。 如果我写#include &lt;cv.h&gt;, #include &lt;highgui.h&gt;,2.0 版就可以使用。 (2.0 版没有文件opencv2,所以我必须包含方向。)我不知道为什么会这样。

解决方法是使用 2.0 版本,同时不使用#include &lt;opencv2/opencv.hpp&gt;。到目前为止,它在大多数示例中都可以很好地运行。虽然我现在可以开始我的项目,但我仍然试图弄清楚如何使用最新版本的 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 等。
  • 好的,那我试试看!

标签: opencv wxwidgets


【解决方案1】:

opencv 库丢失。在您的屏幕显示中,您添加了文件夹,但配置中的名称定义为 -opencv_core... 。通常链接它们的选项是 -L,即使在 wxDev++ 中也是如此。所以只需添加如下库:

-Lopencv_core2413.lib

【讨论】:

  • 我用不同的方式命名它,“-Lopencv_core2413.lib”、“-Lopencv_core2413”。它仍然无法正常工作,但仍然感谢您的帮助!
  • 查看opencv的lib文件夹是否有x86或x64的子文件夹,我经常犯这个错误...
  • 好的,我会重新检查所有链接以防遗漏。
【解决方案2】:

根据你的源码,你忘记使用opencv命名空间了。

如果您的库都链接正确,请尝试添加using namespace cv;

#include "opencv2/opencv.hpp"
using namespace cv;

int main()
{
    IplImage *srcImg = NULL;

    srcImg = cvLoadImage( "temp.jpg", 1);
    if( srcImg == NULL ){
        return -1;
    }

    cvShowImage( "Source", srcImg ); 
    cvWaitKey(0);
    cvReleaseImage( &srcImg );
}

或明确使用它:

#include "opencv2/opencv.hpp"
int main()
{
    cv::IplImage *srcImg = NULL;

    srcImg = cv::cvLoadImage( "temp.jpg", 1);
    if( srcImg == NULL ){
        return -1;
    }

    cv::cvShowImage( "Source", srcImg ); 
    cv::cvWaitKey(0);
    cv::cvReleaseImage( &srcImg );
}

希望对你有帮助

【讨论】:

  • 看来你是对的,我应该为程序添加命名空间。但是,仍然存在相同的错误。无论如何,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2012-04-23
  • 2016-11-13
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 2012-06-23
  • 2012-07-19
相关资源
最近更新 更多