欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

64位Linux(Ubuntu)下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录

程序员文章站 2022-05-28 11:54:29
...

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  228 13:35 ./
drwxr-xr-x 11 root root 4096  227 20:09 ../
drwxr-xr-x 11 root root 4096  228 13:35 Qt-arm-4.8.6/
drwxr-xr-x 13 root root 4096  228 10:42 Qt-qvfb-4.8.6/
drwxr-xr-x 13 root root 4096  227 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

启动之后的界面如下所示:

64位Linux(Ubuntu)下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录

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

便可完成示例代码的启动运行。运行的效果如下:

64位Linux(Ubuntu)下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录

搞定!

第三步、安装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系统的安装界面。如下图所示,一步步按照要求确认就可以完成安装流程了。

64位Linux(Ubuntu)下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录

等待操作完成即可,如下图所示。

64位Linux(Ubuntu)下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录

第四步、配置QtCreator

QtCreator安装完毕之后,启动便可直接使用。但是有一个问题,它并不知道你的系统中安装了哪些Qt库,也不知道你将这些库安装在什么位置。因此,当你第一次启动QtCreator时,必须对其进行配置。

点击’工具’-‘选项’,弹出配置界面。在其中选择’构建和运行’页面,在’QT版本’标签下,分别配置你所安装的各个Qt库的相关信息。

首先配置Qt版本路径信息。如下图所示,分别配置好qt-x11、qt-qvfb、qt-arm这3个库的路径信息(即各个库中的qmake文件所在的路径信息)。

64位Linux(Ubuntu)下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录

然后配置工具链的路径。因为Qt只能自动识别出x86平台下的gcc编译器所在路径,arm-linux-gcc的路径无法自动识别,需要手工去指定。如下图所示:

64位Linux(Ubuntu)下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录

至此,基本完成了QtCreator运行所必须的各项参数的配置,可以开始新建工程进行实际操作了,如下图所示。

步骤1、新建工程 
64位Linux(Ubuntu)下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录

步骤2、输入工程名 
64位Linux(Ubuntu)下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录

步骤3、设置目标 
64位Linux(Ubuntu)下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录

64位Linux(Ubuntu)下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录

步骤4、设置类信息 
64位Linux(Ubuntu)下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录

*步骤5、项目管理 
64位Linux(Ubuntu)下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录

步骤6、工程视图 
64位Linux(Ubuntu)下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录

第四步、编译和运行

完成代码的编码工作之后,点击左下角的’构建目标选择器’,可以*选择你需要构建的项目目标,包括x11目标、qvfb目标、以及arm目标。如下图所示:

64位Linux(Ubuntu)下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录

64位Linux(Ubuntu)下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录

要注意的是:

  • 如果选择的是桌面版本的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环境的程序运行情况截图 
64位Linux(Ubuntu)下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录

基于qvfb环境的程序运行情况截图 
64位Linux(Ubuntu)下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录

至此,嵌入式Qt开发的安装和搭建工作基本完成,剩下的问题以后再慢慢摸索吧。