zoukankan      html  css  js  c++  java
  • 【Qt开发】【VS开发】【Linux开发】OpenCV、Qt-MinGw、Qt-msvc、VS2010、VS2015、Ubuntu Linux、ARM Linux中几个特别容易混淆的内容

    【Qt开发】【VS开发】【Linux开发】OpenCV、Qt-MinGw、Qt-msvc、VS2010、VS2015、Ubuntu Linux、ARM Linux中几个特别容易混淆的内容

    标签:【Qt开发】 【VS开发】 【Linux开发】


    这几天不断地在windows、VMWare Ubuntu14.04、ARM-Linux上反复折腾Qt-creator,OpenCV的开发,弄得有些乱七八糟,想的是配置出一个完整的四种不同环境之间的可移植验证平台。目的是一个完整的Qt-Creator程序,可以通过复制源码很快的从windows平台上移植到Linux平台上,然后再通过VMWare Ubuntu上的交叉编译工具再移植到ARM-Linux上,从而实现完整的三种平台(Windows、Linux、ARM-Linux)上的可移植性。在这个过程中遇到了几个比较容易犯的认识上的错误,下面进行整理一下。


    首先谈Windows上的配置吧。我第一次装的是Qt Creator(4.7),从极速上下载的可配置在VS2010上的不许安装直接运行的版本,感觉比较老,然后又下载了qt-opensource-windows-x86-mingw530-5.7.0版本,Qt Creator界面看上去很好看。虽然VS2010上的Qt插件是存在,但是我没用过,因为想着用Qt就是为了它的可移植性,所以最好在所有的平台上都配置一样,然后直接粘贴代码就可以实现一次编写,到处编译,到处运行。所以,最好是脱离掉visual studio这个只能在windows上才有的开发环境。选择QtCreator是一个非常好的开始。

    所以,在Windows上我用的QtCreator能配置的就只有两个,Desktop Qt5.7.0 MinGW 32bit,虽然检测到了MSVC的编译器,但是在这个只为Qt-MinGW的版本上,我是没能配置好使用VS2010的编译器进行开发,实际上可能真的也配置不好,因为编译器不同,MinGW-gcc编译出的库跟MSVC编译出的库根本不能相互识别,这也是为何在虚拟机Linux上开发出的程序在ARM-Linux上不能跑的原因。所以当我尝试用Qt-Creator-MinGW去在windows上包含用VS2010即MSVC2010编译好的opencv库的时候,QtCreator工程根本通过编译,虽然配置已经确定是正确的:

    INCLUDEPATH += D:opencvuildinclude
    
    win32:CONFIG(debug, debug|release): {
    LIBS += -LD:opencvuildx86vc10lib 
    -lopencv_core249d 
    -lopencv_imgproc249d 
    -lopencv_highgui249d 
    } else:win32:CONFIG(release, debug|release): {
    LIBS += -LD:opencvuildx86vc10lib 
    -lopencv_core249 
    -lopencv_imgproc249 
    -lopencv_highgui249 
    }
    

    输出错误为:

    E:Programming LangurageQtProjects	est-opencvmain.cpp:9: error: undefined reference to `cv::namedWindow(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)'
    
    E:Programming LangurageQtProjects	est-opencvmain.cpp:10: error: undefined reference to `cv::waitKey(int)'
    

    很明显,跟我在VMWare Linux下交叉编译时调用了主机上的库时爆出的错误基本类似:

    /usr/local/lib/libdrm_omap.so:-1: error: file not recognized: File format not recognized
    

    就是说这些库可能连格式都不同,所以不要动歪脑筋了,要想程序能够正确编译、链接和运行,需要完整一套使用相同编译器(可能没这么严苛,但是至少是同一类型,比如高版本和低版本之类的)编译的库,然后程序的编译也是需要同样的编译器。所以,只要配置好编译器的版本,一以贯之,基本上是可以实现开发的。

    那么,怎么办,问题来了,如何实现使用VS2010编译后的opencv的lib呢?

    刚开始,我准备用下载的这个版本的QtCreator去配置所谓的编译器,然后克隆了一个,更换了一下编译器,甚至还专门从微软下载WDK:http://msdn.microsoft.com/en-us/windows/hardware/hh852365,来安装CDB调试器,具体参考《【Qt开发】Qt Creator在Windows上的调试器安装与配置》。

    但是红色的错误感叹号始终没有消除,根本不能使用。这个时候我才意思到一个非常容易犯的错误,其实已经知道,但是总是很难转过来
    弯儿:

    我安装的QtMinGW版本是使用MinGW预编译版本,Qt中的库都是在MinGW-gcc进行编译的,而我却要去调用使用MSVC编译的库,这很显然不可能嘛!回想一下当初移植交叉编译的Qt版本的时候,是不是也是有一步骤是获得Qt的源码,然后利用交叉编译工具链去对Qt源码进行编译,最后生成交叉编译后的Qt,然后才能利用这个交叉编译后的Qt去设置交叉编译环境,然后用来开发ARM-Linux上的程序,就是说开发工具也的是先通过交叉编译工具编译后的版本,对应的库也都是ARM-Linux支持的库,交叉编译gcc支持的库,这样的话才可以通过将这些Qt库放到ARM上,然后使用交叉编译Qt开发出的程序才能在ARM上跑。否则也是会爆出库格式问题的!回过头来看这个Qt-MinGW与VS2010的库也是这个问题。

    下面解决办法就是下载安装了qt-opensource-windows-x86-msvc2015-5.7.0.exe这个版本是针对msvc2015预编译的版本,也就是说应该是支持msvc编译器编译出的库的。但是下载安装之后发现,本地没有msvc编译器,因为我一直用的是VS2010,于是狠下心来,又安装了Visual Studio 2015,这个Visual Studio支持的内容还真多,我本来想也装一下支持移动开发,比如android开发的,但是发现这个磁盘空间需求太大,于是放弃了,只装了基本的支持VC++等,但是也差不多耗掉了9GB的空间,有点狠!

    当时还担心安装完VS2015之后,VS2010就不能用了。不过居然没出问题,还好还好!

    于是问题来了,那么VS2015能使用VS2010编译出来的库吗,也就是MSVC编译器不同版本之间相互支持吗?或者应该相信MSVC2014应该支持MSVC2010,向下兼容应该是支持的。

    于是利用VS2015编写了一个小的测试程序,发现程序能够正常的编译链接和运行。

    于是我就相信了,去配置Qt,用QtCreator-msvc2015创建了一个console的工程,然后使用上边测试QtCreator-mingw的opencv的程序,完全一样的代码和配置(除了编译器不同),这次成功运行了!同时好像直接能够自动检测出Debugger的版本,虽然debugger的时候加载Debugger有点慢,不过也是可以加载调试的!这也就验证了我所说的,编译器版本-库文件-开发工具应该是一整套的!或者说这些东西都应该是在相同的编译器下编译链接和运行的。

    于是,在我的windows电脑上,就配置了三种Qt版本,我以此命名为(Qt Creator(4.7))、(Qt Creator (mingw))和(Qt Creator (msvc2015)),虽然有可能将它们融合到一个QtCreator里面,但是我决定不这样做了,因为可以显式地提醒我编译器-库-开发工具的一致性问题!!!

    谈到这里,QtCreator在构建&运行中可配置不同的Qt版本,这个时候再configure程序配置的时候可以选择,特别地,在不同的版本下,他们的include路径,lib路径等都是基于它们这个版本的Qt下的那些include和libs!

    然后是VS2015,我下载安装的这版本看上去还不错!界面跟VS2010中文旗舰版类似,看上去也比较酷!以后可以多多试试,甚至后续的开发也可以直接挪到VS2015版本上来做!

    那么Windows上的配置已经完成,就是用QtCreator-msvc2015这个版本好了!基本上对应windows上的库应该都能用。而且,在多平台移植的时候,比如LInux平台上,它上面也有对应的LIBS,如果没有,那就可以从源码入手,然后使用本地的gcc进行编译生成对应的库,其实Ubuntu14.04上的OpenCV就是这么来做的!所需要进行修改的可能就是对应的include路径以及LIBS了。所以,可以学着写一下多平台的那种INCLUDEPATH和LIBS的书写方式:

    win32:CONFIG(debug, debug|release): {
    INCLUDEPATH += D:opencvuildinclude
    LIBS += -LD:opencvuildx86vc10lib 
    -lopencv_core249d 
    -lopencv_imgproc249d 
    -lopencv_highgui249d 
    } else:win32:CONFIG(release, debug|release): {
    INCLUDEPATH += D:opencvuildinclude
    LIBS += -LD:opencvuildx86vc10lib 
    -lopencv_core249 
    -lopencv_imgproc249 
    -lopencv_highgui249 
    } else:unix: {
    INCLUDEPATH += /usr/local/opencv-arm2/include
    LIBS += /usr/local/lib/libopencv_core.so
    LIBS += /usr/local/lib/libopencv_highgui.so
    LIBS += /usr/local/lib/libopencv_imgproc.so
    }
    

    上面的方式就是一个非常好的示例,一共配置了两种平台,不过在windows下有两种库,一种是opencv中debug模式的库,一种是release版本的库,这两种库不能混用,这在以前使用VS2010的时候就已经非常清楚了。所以,这里通过上面的语句可以进行区分。注意:在Linux上的库好像不区分release版本还是debug版本,我进行移植的时候没有发现什么release版本和debug版本的不同的库。

    另外,关于LIBS的书写方式既可以是仿照gcc的命令中那样写,也可以直接就像上面我写的unix下面的那种一样,直接把库和绝对路径都带上了。

    通过上面的配置,我已经在Windows上、Ubuntu Linux上、ARM-Linux上配置好了三种不同的QtCreator开发环境,要进行程序移植的话,只需要重复几个粘贴复制即可。只有遇到了没有的库的时候才需要使用local 编译器对源码进行编译,移植好库之后,这几个平台就没有多大的差别了!这里说的ARM-Linux平台,QtCreator并不是在ARM上安装的,而是在Ubuntu Linux上配置的交叉编译环境。当然使用的QtCreator仍然是Ubuntu14.04上安装的,也是5.7.0版本的对应的Qt。很好用!

    所以,进行程序功能验证的时候,过程可以是这样子的:

    现在windows下进行,因为可以先不用打开虚拟机,直接对程序功能进行实现,当功能基本完成,可以通过粘贴复制到Linux或者直接到ARM-Linux上进行编译好了。一般的,功能验证好了,只要对应的库配置正确,就可以实现在ARM上正确运行!


    小结:
    扯得比较多,不过通过这次之后,我电脑上的几个强有力的开发工具都已经配置好了,而且对我来讲Linux开发已经简化到类似Windows开发一样了,当然没有涉及到驱动的开发,不过前段时间在进行EVM6678的PICE开发时,涉及到了Linux PCIE驱动的开发,基本上开发的功能和流程也还算比较熟悉,而且我照葫芦画瓢,按照相同的功能模式,将Linux下的驱动对应到了利用Windriver开发了基于Windows下的PCIE驱动。所以,最近弄得东西真的是有点广,但是还好没乱,还都有点章法!庆幸庆幸!


    2016-9-2 23:00
    张朋艺 pyZhangBIT2010@126.com

  • 相关阅读:
    你所选择的栏目与当前模型不相符请选择白色的选
    DEDECMS首页调用图片集里的多张图片
    dedecms内容页调用图片集文档的图集图片
    Sublime Text 使用介绍、全套快捷键及插件推荐
    基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎
    nutch
    ant安装
    selenium经过WebDriverWait实现ajax测试
    查看当前android设备已安装的第三方包
    批处理学习总结之常用符号
  • 原文地址:https://www.cnblogs.com/huty/p/8518193.html
Copyright © 2011-2022 走看看