64位Linux(Ubuntu)下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录
Qt作为业内最著名的UI开发工具之一,是一套完整的跨平台C++图形用户界面应用程序开发框架,可以实现一套源码,多个平台编译运行。自从1991年被奇趣公司推出之后,在业内获得了广泛的应用,不仅仅被用来UNIX/LINUX平台下的桌面环境KDE,更有其他诸多极为著名的软件工具都是采用Qt开发的,比如:Adobe Photoshop Album(就是大名鼎鼎的PS),Autodesk Maya,Google Earth,Opera,Skype,SMPlayer,VirtualBox,WPS Office,*飞车等等,哈,是不是吓一大跳?
说到跨平台,Qt的本事可不是盖的,不管是windows(x86/x64),linux,MacOS,还是嵌入式arm,全部通吃。换句话说,同一份qt的代码,可以编译成上述各个不同的平台下运行的文件,只需要更换一些配置命令即可。但是,每一种平台下的开发环境搭建的步骤那肯定是不一样的。针对嵌入式环境,搭建过程无疑是最复杂也是最麻烦的,下面就是我本人的亲测过程全记录。
第一步、背景介绍
1、Qt版本介绍
首先介绍一下Qt所能生成出来的各个不同版本之间的区别。
根据所应用的目标系统不同,同一份Qt源码编译后所生成的版本也是不一样的。大致来说分为3种:
第一种是在linux系统上编译完后仍然在linux系统上运行的,称为x11版本(至于为什么叫x11,这是因为linux系统的应用程序与视窗程序之间是通过X窗口系统的X11协议进行交互,所以称之为x11系统。具体请自行百度);
第二种是在linux系统上编译完后转移到arm平台上运行的,称为Embeded arm版本,编译完后的文件必须烧录到arm处理器上运行,在PC端无法运行;
第三种称之为Embeded x11版本,也叫做qvfb版本。这里要解释一下,如前所述,lixnu的应用程序是以X11协议(X窗口系统)输送到屏幕显示界面的,X server负责图形显示,应用程序负责计算、修改数据,两者基于某种协议通信。对于嵌入式linux,qt应用程序同样也需要一个窗口系统才能显示,但是嵌入式linux系统不能使用X11(太耗资源了),奇趣公司就专门开发了一个qws(QT windows system), 应用程序按照协议向qws发送数据,服务端负责显示数据。换句话说,qvfb就是qws的显示设备。不过要注意的是,embeded x11版并不是我们的开发板最终使用的Qt库,编译这个版本只是为了方便我们调试, 先在PC中仿真运行,看看界面,不必下载到开发板的文件系统中运行,两者的运行效果除了界面基本相同,其他方面还是有差异的。
经过上述分析可以看出,其实,我们做嵌入式开发,只需要涉及到后面2种版本,第一种版本的只有桌面应用程序开发的人才需要使用。而对于后面2个版本,严格来说只需编译Embeded arm版本的程序就好,因为它才是最终在arm平台上运行的版本。但是,如果只编译Embeded ARM版本的话,每次编译完都得下载到开发板上去运行才能看到效果,开发过程太过麻烦,因此我们才需要引入Embeded x11版本,借助于PC端的显示系统,快速完成界面部分的调试。所以,综合起来可以这么说,编译x11 版本的目的是为了方便学习Qt,编译Embeded x11是为了体验仿真效果,编译Embeded ARM版本才是为了完成嵌入式程序开发。
2、开发环境介绍
下面对我所安装的开发环境、以及所安装的Qt版本进行介绍,便于对比和查阅。
- 物理机:Windows 10 64位;
- 虚拟器:Virtualbox 5.20;
- 虚拟机:Ubuntu 12.04 64位;
- QtLib版本:qt-everywhere-opensource-src-4.8.6.tar.gz(点此直接下载)
- QtCreator版本:qt-creator-linux-x86_64-opensource-2.5.2.bin(点此直接下载)
这里说明一下我选择上述Qt版本的原因。我下载的时间是2017年2月底,此时,Qt Library的版本已经更新到了5.8.0,而Qt Creator的版本已经更新到了2.5.2。不过,鉴于网上部分网友的建议,说5.0之后的Qt库,用的人还比较少,一旦遇到问题,不太好解决,因此建议仍然使用5.0之前的库。所以,我就选择了5.0之前的最后一个版本的库,也就是4.8.6。
3、安装准备工作
下载完qt的源码包之后进行解压。此处要注意的是,根据上述分析,根据运行环境和目标环境的不一样,Qt分为3个版本,这3个版本的源码其实是一样的,只是配置文件不一样,才会最终导致生成的文件不一样(这也就是为什么这个源码的压缩包叫做qt-everywhere的原因,其本意就是一个源码包可以通吃所有应用场合)。
所以,你需要根据你自己的需求,将该源码包解压出若干份出来(或者解压出一份然后复制也行,不过实测证明解压比复制快)。比如,我想要进行嵌入式开发,那就至少要解压出2份,一份用于编译Embeded arm版本,另一份用于编译Embeded x11版本;而如果我同时还想要学习一下桌面x11版本,则还需要再解压出一份x11版本。所以,我在home目录下创建了一个临时目录qt,然后在qt目录下再新建了3个目录用于分别存放各个版本的源码,各个子目录命名及其用途如下:
- qt-x11目录:存放x11桌面版本的源码;
- qt-qvfb目录:存放Embeded x11(qvfb)版本的源码;
- qt-arm目录:存放Embeded arm版本的源码;
另外还需要顺便说明一下的是,上述步骤只是完成了对3个版本的源码目录的区分,当他们编译完成之后安装到系统中去时,同理,也要进行目录上的区分,否则会混乱不堪。届时,我们将通过命令行参数来进行指定,后面会详细介绍,此处只做铺垫介绍。
准备工作的最后一步,就是安装一下qt所依赖的一些系统库,执行如下命令即可:
sudo apt-get install g++
sudo apt-get install libx11-dev libxext-dev libxtst-dev
sudo apt-get install xlibmesa-gl-dev libglu1-mesa-dev
- 1
- 2
- 3
最后一条命令是用于安装OpenGL的依赖库,如果你用不到OpenGL,则不用安装。
第二步、安装Qt库
1、安装x11版本的Qt
进入qt-x11目录,按顺序执行以下命令即可:
./configure -opensource -confirm-license -prefix /usr/local/Trolltech/Qt-x11-4.8.6
make
sudo make install
- 1
- 2
- 3
需要说明的是,make命令耗时较长,以我i3-4160处理器、8G内存的配置,大约半个多小时。执行完毕后,Qt就会自动安装到/usr/local/Trolltech/Qt-x11-4.8.6目录下。
2、安装qvfb版本的Qt
进入qt-qvfb目录,按顺序执行以下命令即可:
./configure -opensource -confirm-license -prefix /usr/local/Trolltech/Qt-qvfb-4.8.6 -embedded x86 -xplatform qws/linux-x86_64-g++ -qvfb
make
sudo make install
- 1
- 2
- 3
这里要说明的是,此处的config配置参数是本人实测OK的,网上很多教程里贴的参数,大多不能用。其中特别要注意“-xplatform qws/linux-x86_64-g++”字段,因为我本人的Ubuntu系统是64位的,所以将平台参数配置成linux-x86_64的。
3、安装arm版本的Qt
进入qt-arm目录,按顺序执行以下命令即可:
./configure -opensource -confirm-license -prefix /usr/local/Trolltech/Qt-arm-4.8.6 -embedded arm -xplatform qws/linux-arm-g++
make
sudo make install
- 1
- 2
- 3
4、安装qvfb
重新进入qt-x11目录,按顺序执行以下命令:
cd tools/qvfb
make
- 1
- 2
make完后,会在qt-x11/bin目录下生成一个qvfb的可执行文件。将该文件拷贝到 /usr/local/Trolltech/Qt-x11-4.8.6/bin目录。
要特别说明的是,这里的qvfb必须是在qt-x11目录下编译,而不是在qt-qvfb目录下编译。网上有不少人没写清楚,害我一开始以为是在qt-qvfb目录下编译,弄了半天才发现目录搞错了!
OK,至此已经完成了3个版本的Qt源码的编译和生成,并在/usr/local/Trolltech/目录下已经生成了相应的文件。
aaa@qq.com:~$ ll /usr/local/Trolltech/
总用量 20
drwxr-xr-x 5 root root 4096 2月 28 13:35 ./
drwxr-xr-x 11 root root 4096 2月 27 20:09 ../
drwxr-xr-x 11 root root 4096 2月 28 13:35 Qt-arm-4.8.6/
drwxr-xr-x 13 root root 4096 2月 28 10:42 Qt-qvfb-4.8.6/
drwxr-xr-x 13 root root 4096 2月 27 20:11 Qt-x11-4.8.6/
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
5、修改环境变量
对于上述步骤4所生成的qvfb,不少同学可能会想立即启动起来看看。但是,在命令行输入qvfb时,系统会提示找不到该文件。这是因为尚未将该目录加入环境变量的原因。因此,下面我们要将该目录加入到环境变量中去,便于后续的引用和执行。
sudo vi /etc/profile
- 1
在文件的末端加入下面的语句:
export QTDIR=/usr/local/Trolltech/Qt-x11-4.8.6
export PATH=$QTDIR/bin:$PATH
export MANPATH=$QTDIR/man:$MANPATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
- 1
- 2
- 3
- 4
保存,退出即可。之后,在任意位置输入qvfb都可以启动该程序了,也可以通过命令指定qvfb的界面尺寸:
qvfb -width 800 -height 400
- 1
启动之后的界面如下所示:
6、自定义配置参数
大家注意到了,执行上述步骤1-3时,基本步骤都是一样的,唯一的差别就是在config命令所携带的参数上面,用简单的命令来控制和生成不同的目标,这就是qt的奥妙所在。
当然,为了简单起见,上面我所列举的配置参数,仅仅是一些最最基本的参数,qt还支持非常多的自定义参数(可以通过./configure -help命令来查看)。大家如果有兴趣,可以自己去研究。不过,该命令内容较多,需要翻页查看,不太方便,因此建议大家通过下述命令将config命令的帮助文件导出到configcmd文件中慢慢分析。
./configure -help > configcmd
- 1
需要说明的是,貌似qt-4.8.6版本的help文件内容有所缺失,并未包含qt所支持的全部配置参数。这一点,网上也有人指出了,并列出了qt-4.8.6版本的help文件与qt-4.5.3版本的help文件进行对比。有兴趣的同学可以自己去研究一下。
7、验证可用
经过上面一番倒腾,总算是把嵌入式开发所需要的各个版本的Qt全部安装完毕了。那么,究竟是否安装成功了呢?我们需要进行一下验证。很简单,Qt库自己有相应的示例,仅需简单调用一下便可。
qvfb -width 800 -height 400
cd /usr/local/Trolltech/Qt-qvfb-4.8.6/examples/widgets/calculator/
./calcular -qws
- 1
- 2
- 3
便可完成示例代码的启动运行。运行的效果如下:
搞定!
第三步、安装QtCreator
经过上述各个步骤,基本完成了Qt编译库和编译工具的安装。至此为止,确实是可以进行Qt的开发了。但是,如果要进行实际的界面设计和集成,还缺少一个步骤,那就是集成开发环境的安装,即QtCreator。QtCreator是Qt自带的集成开发环境(类似于ARM的ADS/Keil/IAR,或者windows的VS等),它的设计目标是使开发人员能够利用Qt这个应用程序框架更加快速及轻易的完成开发任务。
相比Qt Library,QtCreator的安装要简单的多,我们下载的bin文件是可执行文件,安装时会出现像在Windows下的界面,安装路径默认就可以了。使用终端cd到你刚刚存放QtCreator的临时目录,修改bin文件的权限使其具有可执行的权限:
chmod a+x qt-creator-linux-x86_64-opensource-2.5.2.bin
- 1
然后输入以下命令安装bin文件:
./qt-creator-linux-x86_64-opensource-2.5.2.bin
- 1
就会出现仿windows系统的安装界面。如下图所示,一步步按照要求确认就可以完成安装流程了。
等待操作完成即可,如下图所示。
第四步、配置QtCreator
QtCreator安装完毕之后,启动便可直接使用。但是有一个问题,它并不知道你的系统中安装了哪些Qt库,也不知道你将这些库安装在什么位置。因此,当你第一次启动QtCreator时,必须对其进行配置。
点击’工具’-‘选项’,弹出配置界面。在其中选择’构建和运行’页面,在’QT版本’标签下,分别配置你所安装的各个Qt库的相关信息。
首先配置Qt版本路径信息。如下图所示,分别配置好qt-x11、qt-qvfb、qt-arm这3个库的路径信息(即各个库中的qmake文件所在的路径信息)。
然后配置工具链的路径。因为Qt只能自动识别出x86平台下的gcc编译器所在路径,arm-linux-gcc的路径无法自动识别,需要手工去指定。如下图所示:
至此,基本完成了QtCreator运行所必须的各项参数的配置,可以开始新建工程进行实际操作了,如下图所示。
步骤1、新建工程
步骤2、输入工程名
步骤3、设置目标
步骤4、设置类信息
*步骤5、项目管理
步骤6、工程视图
第四步、编译和运行
完成代码的编码工作之后,点击左下角的’构建目标选择器’,可以*选择你需要构建的项目目标,包括x11目标、qvfb目标、以及arm目标。如下图所示:
要注意的是:
- 如果选择的是桌面版本的Qt-x11目标,那么可以在编译完后直接点击运行按钮进行运行。
- 如果选择的是桌面版本的Qt-qvfb目标,那么编译完后是无法直接运行的,会提示”QWSSocket::connectToLocalFile could not connect:: 拒绝连接”。这是因为,该目标是基于qvfb来构建的,无法基于x11桌面系统来显示。必须先将qvfb运行起来,然后在终端命令行中输入’qvfb -width 800 -height 400’,然后进入该目标所在目录,输入’./test -qws’,程序方可正常运行,同时会给出’Connected to VFB server :0: 800 x 400 x 32 282x141mm (72x72dpi)’的提示。
- 如果选择的是嵌入式版本的Qt-arm目标,那么编译完后必须下载到arm目标版上才能运行,在PC端是无法运行的。
基于x11环境的程序运行情况截图
基于qvfb环境的程序运行情况截图
至此,嵌入式Qt开发的安装和搭建工作基本完成,剩下的问题以后再慢慢摸索吧。
上一篇: dev-tools安装使用踩坑
下一篇: AIDL使用与踩坑部分总结