codeblocks搭建opencv完整教程(二)—— MinGW版OpenCV配置方法

        本文主要是codeblocks在配置完OpenCV后可能出现的一些列问题的原因和解决方法,其中涉及用cmake+MinGW编译OpenCV源代码相关操作步骤。

        *配置环境以及所涉及软件版本:

                *操作系统:win7系统   

                *IDE版本:codeblocks 13.12 (MinGW 4.7.1)

                *OpenCV版本: 2.4.10

                *编译辅助工具:cmake-3.2.2-win32-x86

 

        按照上一篇博文“codeblocks搭建opencv完整教程(一)”介绍的步骤配置完成后,按理说就可以“完美”运行OpenCV程序了,但实际情况却不然,比如运行以下例程:

//播放一段名为“test.avi”的视频
#include <cv.h>
#include <opencv2\opencv.hpp>

using namespace cv;

int main()
{
    VideoCapture capture;
    capture.open("test.avi");
    while(true)
    {
        Mat frame;
        capture>>frame;
        imshow("videotest",frame);
        waitKey(10);
    }
    return 0;
}


结果编译时出现以下许多错误:

        .../main.cpp:8: undefined reference to `cv::VideoCapture::VideoCapture()'

        .../main.cpp:9: undefined reference to `cv::VideoCapture::open(std::string const&)'

        .../main.cpp:13: undefined reference to `vtable for cv::VideoCapture'

        .../main.cpp:14: undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'

        .../main.cpp:14: undefined reference to `cv::imshow(std::string const&, cv::_InputArray const&)'

        .../main.cpp:15: undefined reference to `cv::waitKey(int)'

        .../main.cpp:17: undefined reference to `cv::VideoCapture::~VideoCapture()'

        ... ...

 

        明明已经配置好所有步骤了,为什么还会出现“VideoCapture未定义”一类的错误呢!?

        不仅以上代码如此,你可以试试其他很多涉及OpenCV C++接口的代码,都会出现类似的错误,而运行C接口的代码诸如VideoCapture对应的CvCapture却没有问题,这是为什么呢!?

        其实原因很简单,这并不是前面配置的问题,而是涉及库编译的问题。这就要从在上一篇“codeblocks搭建opencv完整教程(一)”中所提到的添加lib路径时所看到的vc10,vc11,vc12三个文件夹说起了。

解释

{

        OpenCV自从版本2.3.x之后,安装过程越来越简单,只需下载下来解压,即可得到编译好的OpenCV文件。而在2.3版本之前,下载下来的OpenCV只有源码,因此还需要对源码进行编译,才能生成我们现在能看到的bulid文件夹中的内容。既然涉及编译,那肯定就需要相应的编译工具(编译器)了,不同编译器编译出来的OpenCV,只能在相应的编译环境下运行,比如前面提到的vc10,vc11,vc12就是用vs2010,vs2012,vs2013所自带的编译器编译完成的,在早前的如OpenCV 2.3.1中还有vc9(对应vs2008)和mingw版本,而在2.4版本之后便只有vc系列了。

        说到这里我们应该就能明白,为什么会出现前面“未定义”的错误了。

        codeblocks默认的编译器是MinGW,而当前所用OpenCV版本是2.4.10,所带build中的lib库只有vc10,vc11,vc12三个版本,这些都是VS编译器编译出来的,放在MinGW环境下自然会出问题了。之所以运行OpenCV的C接口代码没问题,个人推断是因为C接口的OpenCV 1.0时代的产物,自2.0版本之后基本都没有什么改变(C++接口是自2.0之后才出现的,之后OpenCV的更新也主要是针对C++接口了,这是趋势),所以MinGW和VS编译出来的C接口的Lib库基本差不多可以共用。而C++接口一直在更新改变,MinGW和VS编译出来的C++代码差异性也比较大,自然也就无法兼容了,因此出现找不到“VideoCapture定义”一类的错误也就不足为奇了。

        概括之,出现上述问题的原因,其实就是用的codeblocks所带的MinGW编译器与OpenCV编译版本不一致造成的。

}

        解决方法也很简单,自然是将OpenCV换成与codeblocks对应MinGW编译环境一致的编译版本了。

     **大致解决方法有两种:

        1、一种是下载2.4版之前的OpenCV,比如2.3.1,里面带着编译好的mingw版的OpenCV lib库,这种方法简单,但注意要保证codeblocks的mingw版本与编译OpenCV的mingw版本一致,如果不一致在运行时也会出现错误。

比如,用codeblocks13.12(自带的mingw为4.7.1)按“codeblocks搭建opencv完整教程(一)”的方法(注意选择/lib时选择mingw版的)配置OpenCV 2.3.1,配置完成后,运行前面给的代码,编译时没有了“VideoCapture未定义”一类的错误,但在实际运行时却会出现如下图“opencv 无法定位程序输入点__gxx_personality_v0于动态链接库libstdc++-6.dll上”的错误。

                

        这就是应为用的mingw版本跟编译OpenCV的mingw版本不一致造成的。

       (至于OpenCV 2.3.1到底是用哪个版本的mingw编译,应该对应哪个版本的codeblocks,大家自己去查其自带的文档吧)

 

        2、这里着重介绍第二种方法,借助cmake工具用当前所用的codeblocks里带的mingw去编译下载下来的OpenCV源码(就是那个source文件夹)。

        不熟悉Linux系统的人可能对这种先编译源代码再运行程序的方法比较陌生,但其实这种方法虽然略有些麻烦,但好处也是很多的,比如用cmake编译出来的代码可以查看OpenCV的实现源码以及它的文件组成关系。而且编译出来的文件肯定是与当前编译器完美兼容的,不用再担心会出现各种各样奇葩的问题,可以放心大胆的运行网上给出的各种OpenCV例程。大笑

废话不多说,以下是大致步骤

        (1)首先下载编译工具cmake,这里用的cmake版本是cmake-3.2.2-win32-x86,可以到官网http://www.cmake.org/download/去下载,下载完成后安装即可。

        (2)运行cmake,在where is the source code中填入OpenCV源代码文件的路径,这里用的路径是“E:/MyLib/opencv_2410/sources”;在where to build the binaries中填入编译文件需要存放的路径,这里用的是“E:/OpenCV2.4.10/MinGW/Debug”(存放路径文件自己定义新建一个即可):

                 

 

        (3)点击“Configure”;在Specify the generator for this project中选择CodeBlocks - MinGW Makefiles,选中Specify native compilers,点击“Next”;

                 

 

        (4)选择编译器路径,这里Compilers: C 选择目录为“codeblocks安装路径/MinGW/bin/gcc.exe”; C++ 选择目录为 “codeblocks安装路径C:/MinGw/bin/g++.exe”,点击“Finish”;

                 

 

        (5)然后再次点“Configure”;

                 

 

        (6)等走完进度条,选择需要的Generate选项,此处可以不操作直接点“Generate”,走完进度条便生成了“MinGW Makefiles”;

                 

 

        (7)之后用mingw对其进行编译,cmd打开命令提示符窗口,进到刚才的保存目录,这里是“E:/opencv2.4.10/MinGW/Debug”,输入“mingw32-make”,回车;等待运行完毕后,输入 mingw32-make install,回车;(此过程大约需1-2个小时)

 

        (8)运行完毕后便生成了mingw版的OpenCV库,进入“E:/opencv2.4.10/MinGW/Debug/install”文件夹,便可以看到所需的头文件和库文件;

                

 

        (9)对照“codeblocks搭建opencv完整教程(一)”中头文件、库文件以及动态库调用的设置方法,设置完成后,最开始给出的代码例程便可顺利运行;

 

猜你喜欢

转载自blog.csdn.net/GooMaple/article/details/45649305