【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:\opencv\build\include
win32:CONFIG(debug, debug|release): {
LIBS += -LD:\opencv\build\x86\vc10\lib \
-lopencv_core249d \
-lopencv_imgproc249d \
-lopencv_highgui249d \
} else:win32:CONFIG(release, debug|release): {
LIBS += -LD:\opencv\build\x86\vc10\lib \
-lopencv_core249 \
-lopencv_imgproc249 \
-lopencv_highgui249 \
}
输出错误为:
E:\Programming Langurage\QtProjects\test-opencv\main.cpp:9: error: undefined reference to `cv::namedWindow(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)'
E:\Programming Langurage\QtProjects\test-opencv\main.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:\opencv\build\include
LIBS += -LD:\opencv\build\x86\vc10\lib \
-lopencv_core249d \
-lopencv_imgproc249d \
-lopencv_highgui249d \
} else:win32:CONFIG(release, debug|release): {
INCLUDEPATH += D:\opencv\build\include
LIBS += -LD:\opencv\build\x86\vc10\lib \
-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
【Qt开发】【VS开发】【Linux开发】OpenCV、Qt-MinGw、Qt-msvc、VS2010、VS2015、Ubuntu Linux、ARM Linux中几个特别容易混淆的内容的更多相关文章
- ubuntu 交叉编译arm linux 内核小例子
下载arm-linux-gcc 4.2.3http://code.google.com/p/princess-alist/downloads/detail?name=arm-linux-gcc-4.3 ...
- 【Linux开发】Linux及Arm-Linux程序开发笔记(零基础入门篇)
Linux及Arm-Linux程序开发笔记(零基础入门篇) 作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/beer ...
- Kernel Memory Layout on ARM Linux
这是内核自带的文档,讲解ARM芯片的内存是如何布局的!比较简单,对于初学者可以看一下!但要想深入理解Linux内存管理,建议还是找几本好书看看,如深入理解Linux虚拟内存,嵌入系统分析,Linux内 ...
- 【Qt开发】【Linux开发】Qt程序在嵌入式设备(arm) 上运行,鼠标擦除界面的解决方案
笔者最近想在arm开发板上,开发一个应用程序,经过网上查询发现qt作为跨平台开发软件很不错,于是便选择了qt开发,笔者的qt版本是4.8.6的.由于arm的主频太低,在arm上进行开发编译,效率会大大 ...
- 【Linux开发】【Qt开发】配置tslibs触摸屏库环境设置调试对应的设备挂载点
[Linux开发][Qt开发]配置tslibs触摸屏库环境设置调试对应的设备挂载点 标签(空格分隔): [Linux开发] [Qt开发] 比如: cat /dev/input/mice cat /de ...
- 【Linux开发】【Qt开发】嵌入式Qt程序使用触屏或USB鼠标方式
上文<嵌入式Qt开发-移植到ARM开发板 >介绍了Qt程序的移植,本文再说下如何使开发板Qt程序使用触摸屏或USB方式进行交互. 之前刚把一个qt程序移植到arm板上成功运行显示时就开心的 ...
- 【Linux开发】【Qt开发】ARM QT移植详细步骤教程
ARM QT移植详细步骤教程 米尔SAM9X5和A5D3X上默认的Qt版本是4.5.3,当这个版本的Qt库不能满足实际开发需求时,可通过此方法制定Qt开发.运行环境. 移植的步骤如下: 1.下载新版q ...
- Linux上使用Qt Creator进行C/C++开发
目录[-] 1.安装Qt Creator和基础构建环境(以Ubuntu为例): 2.把自动完成快捷键"Ctrl+空格"改为"Alt+/"或者"Shif ...
- 【Linux开发】【Qt开发】arm-linux-gnueabihf-gdb versus gdb-multiarch
主要是说,在Ubuntu14.04 64bit的操作系统上,配置Qt的gdb和gcc的时候,在Qt build&run选项中,debugger中选中arm-linux-gnuabihf-gdb ...
随机推荐
- IDL_MCTK(MODIS Conversion Toolkit)
1.CONVERT_MODIS_DATA CONVERT_MODIS_DATA [,IN_FILE= | | }] [,GEOLOC_FILE= | | }] [,CALIB_METHOD={ | | ...
- redis中如何存储java对象
根据redis的存储原理,Redis的key和value都支持二进制安全的字符串 1.利用序列化和反序列化的方式 存储java对象我们可以通过对象的序列化与反序列化完成存储于取出,这样就可以使用red ...
- hexo+github+Theme Art Design文章发布
新建 hexo new "YYYY-MM-DD-title" 为了更好的标识文章和防止重复,文章对应的markdown文件的命名应该遵循:YYYY-MM-DD-title 格式. ...
- cursor-spacing 软键盘和input的距离
指定光标与键盘的距离,单位 px .取 input 距离底部的距离和 cursor-spacing 指定的距离的最小值作为光标与键盘的距离. 例: 软键盘和input的距离300px
- Python---webserver项目
# HTTP项目实战 - 深入理解HTTP协议 - 模拟后台服务程序基本流程和大致框架 - 每一个步骤一个文件夹 - 图解http协议,图解tcp/ip协议 # v01-验证技术 - 验证socket ...
- 解决postgresql在docker中无法保存状态的问题
PS:最佳解决方式是将目录挂载到宿主机,容器出问题了,数据还在,以下方式容器出问题会丢失数据,以下思想只供参考!!! 用过docker的人都知道,docker是不适合来放数据库的,这也不是绝对的.如果 ...
- Educational Codeforces round 78 A、B
链接:https://codeforces.com/contest/1278 A:Shuffle Hashing 题意:对于一个字符串p可以执行一个"hash"操作,首先将p内的元 ...
- 14. ClustrixDB 高可用性的最佳实践
本文档详细介绍了最大化ClustrixDB上运行的应用程序正常运行时间的最佳实践.这涵盖了广泛的主题,从环境需求到变更管理程序,所有这些最终都会影响应用程序的可用性.其中许多是您可能已经熟悉的标准最佳 ...
- UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)
题意 : 有装满水的6升的杯子.空的3升杯子和1升杯子,3个杯子中都没有刻度.不使用道具情况下,是否可量出4升水呢? 你的任务是解决一般性的问题:设3个杯子的容量分别为a, b, c,最初只有第3个杯 ...
- 【bzoj1189】[HNOI2007]紧急疏散evacuate
*题目描述: 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是’.’,那么表示这是一块空地:如果是’X’,那么表示这是一面墙,如果是’D’,那么表示这是一扇门,人们 ...