Chinaunix首页 | 论坛 | 博客
  • 博客访问: 330917
  • 博文数量: 47
  • 博客积分: 834
  • 博客等级: 军士长
  • 技术积分: 695
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-07 09:38
文章分类
文章存档

2018年(1)

2015年(1)

2014年(2)

2013年(2)

2012年(23)

2011年(18)

分类: 嵌入式

2015-07-14 14:02:22

Linux下安装QT编译环境

——ubuntu10.04

 

一、学会区分qt-x11qt-x86qt-arm

QT源码可以被编译成很多个版本,这里介绍3个版本:linux桌面版(X11)embeded x86版,embeded arm版。编译后生成对应平台库文件,使用某平台的编译器编译应用程序时就会链接对应平台的库文件,这样应用程序就能在该平台下运行。

1-1X11版(默认版本)

X11版本的QT可以在使用X windows系统的linux 桌面操作系统上运行(我用的是Ubuntu),如果不需要开发桌面应用程序,可以不编译。

 

1-2Embeded x86

这个版本为什么是嵌入版(Embeded)的,因为x86台式机本身也可以当做一个嵌入式系统,但是Embeded x86版的QT不能直接通过X11窗口系统输出画面,这时我们可以借助X11qvfb工具仿真一个LCD输出设备(QWS环境),这样Embeded x86应用程序就能在Ubuntu里仿真运行了。要理解这点其实很简单,以Ubuntu为例,Ubuntu的应用程序是以X11协议(X窗口系统)输送到屏幕显示界面的,X server负责图形显示,应用程序负责计算、修改数据,两者基于某种协议通信。对于嵌入式linuxqt应用程序也需要一个窗口系统才能显示,但是嵌入式linux系统不能使用X11(太耗资源了),奇趣公司就专门开发了一个qwsQT windows system), 应用程序按照协议向qws发送数据,服务端负责显示数据。现在,qvfb就是QWS的显示设备。

另外请注意,Embeded x86版的QT应用程序是不能在arm开发板上运行的。

embeded x86版并不是我们的开发板最终使用的QT库,编译这个版本只是为了方便我们调试, 先在ubuntu中仿真运行,看看界面,不必下载到开发板的文件系统中运行,两者的运行效果除了界面基本相同,其他方面还是有差异的。

 

1-3Embeded arm

这个版本才是我们在arm开发板上运行的版本。

 

二、移植qt-arm

网上很多手把手教学都是安装tslib1.4然后给了./configure *****很长的一串配置,我果断拒绝手把手教学,看了一下tslib1.4主要是支持触摸屏用的封装库,然后通过./configure -I **** -Ltslib的封装库包含进来去安装QT,暂时我没有触摸屏的开发需求,这里就不安装tslib,直接安装QT,下面Let’s GO!

下载到qt-everywhere-opensource-src-4.7.4.tar.gz安装包,解压到非安装目录,解压出来的里面有configure,执行./configure会提示选项c商业版qt和选项o开源版qt,果断选择开源版的,接下来提示是否接受条款,这个windows下安装东西也会有的,我是从来不看的直接输入yes,好了,下面坐等生成Makefile文件吧。

貌似有点小问题,下面是从输入yes到安装报错的错误信息,后面需要解决这个问题才能继续下去。

Do you accept the terms of either license? yes

 

Creating qmake. Please wait...

g++ -c -o project.o -pipe -DQMAKE_OPENSOURCE_EDITION -I. -Igenerators -Igenerators/unix -Igenerators/win32 -Igenerators/mac -Igenerators/symbian -I/usr/local/qt-everywhere-opensource-src-4.7.4/include -I/usr/local/qt-everywhere-opensource-src-4.7.4/include/QtCore -I/usr/local/qt-everywhere-opensource-src-4.7.4/src/corelib/global -I/usr/local/qt-everywhere-opensource-src-4.7.4/src/corelib/xml -I/usr/local/qt-everywhere-opensource-src-4.7.4/tools/shared -DQT_NO_PCRE -DQT_BUILD_QMAKE -DQT_BOOTSTRAPPED -DQLIBRARYINFO_EPOCROOT -DQT_NO_TEXTCODEC -DQT_NO_UNICODETABLES -DQT_NO_COMPONENT -DQT_NO_STL -DQT_NO_COMPRESS -I/usr/local/qt-everywhere-opensource-src-4.7.4/mkspecs/qws/linux-x86-g++ -DHAVE_QCONFIG_CPP -DQT_NO_THREAD -DQT_NO_QOBJECT -DQT_NO_GEOM_VARIANT  project.cpp

make: g++: Command not found

make: *** [project.o] Error 127

解决办法参考网上:rpm -qa | grep "g++"查看系统是否缺失g++

rpm -qa | grep "g++"

The program 'rpm' is currently not installed.  You can install it by typing:

apt-get install rpm

可以看到的确缺失了,系统给出解决办法,apt-get install rpm联网安装rpm

安装了重新执行./configure还是同样的错误,上网查到缺失gcc++的原因,是系统需要安装build-essential软件包,这个软件包作用是提供编译程序必须软件包的列表信息,也就是说 编译程序有了这个软件包,它才知道 头文件在哪 才知道库函数在哪,还会下载依赖的软件包,最后才组成一个开发环境。安装apt-get install build-essential。

好了,现在直接执行./configure,等待几分钟,看到结果又一个failed,具体的如下

Basic XLib functionality test failed!
You might need to modify the include and library search paths by editing
QMAKE_INCDIR_X11 and QMAKE_LIBDIR_X11 in /home/zhu/Qt/qt-x11-opensource-src-4.5.2/mkspecs/linux-g++

嗯,看一下是X11的,应该没有配置configure的参数导致某个地方链接错误,现在简单配置一下configure,如下

./configure -prefix /usr/local/Trolltech/QtEmbedded-4.7.4-arm -embedded arm

通过-embedded指定arm环境,避免x11和x86的相关报错,顺便-prefix指定一下qt安装的位置,其他的configure参数参考http://www.cnitblog.com/zouzheng/archive/2010/07/06/67199.html

执行完毕后没有任何报错,正常生成Makefile文件,接下来就执行make,make install安装qt了

安装好qt之后,我们在/etc/profile里面增加一下PATH的环境变量,把qt安装目录的bin目录包含进去,以后就可以在你的qt工程目录直接qmake生成Makefile文件了

    下面我试一下编译一个arm平台的qt工程,进入工程目录执行qmake时候报错,内容如下
QMAKESPEC has not been set, so configuration cannot be deduced.

应该是QMAKESPEC 环境变量没有设置,我们在/etc/profile里面增加上export QMAKESPEC=/usr/local/Trolltech/QtEmbedded-4.7.4-arm/mkspecs/linux-g++,好了qmake执行又遇到新问题了

Failure to read QMAKESPEC conf file /usr/local/Trolltech/QtEmbedded-4.7.4-arm/mkspecs/linux-g++:/qmake.conf. Error processing project file: ******,

看一下上面提到的qmake.conf,包括qmake.conf这个文件里面加载的几个脚本都看一下,没有任何与交叉编译器有关的东西,既然是ARM平台的怎么少得了交叉编译器,想想应该是交叉编译环境搭建好之后没有与qt进行有效的关联,仔细查看configure的参数,有一个-xplatform可以配置,上网查资料看到有人用-xplatform  qws/linux-arm-g++,指定到qt目录下的mkspecs/qws/linux-arm-g++,这个目录里面刚好有qmake.conf,打开看一下是arm-linux-arm的交叉编译环境,因为我的交叉编译的bin目录已经增加到PATH环境变量,这个qmake.conf里面的arm-linux-gcc就已经对应到我的交叉编译环境了,就不需要具体的目录位置,不需要改直接退出。

对于这里我为什么用arm-linux-gcc而不是用网上很多人用的arm-none-linux-gnueabi-gcc,因为看arm-linux-gcc -v和arm-none-linux-gnueabi-gcc -v的Target: arm-none-linux-gnueabi都是一样的,而且版本号都是gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72) ,所以推测这两个东西就是同一个东西,只不过是交叉编译自动通过ln链接了一个arm-none-linux-gnueabi-gcc到交叉编译环境的bin目录,成为了arm-linux-gcc,当然啦,这是我个人猜测,没有深究。如果想用arm-none-linux-gnueabi-gcc的,在mkspecs/qws/里面也有linux-arm-gnueabi-g++的目录,应该和mkspecs/qws/linux-arm-g++的用法一样,换一个目录而已,后面继续闯关。

把之前安装的复原,包括/etc/profile里面的环境变量,删除QtEmbedded-4.7.4-arm目录,删除qt源码,重新解压,重启虚拟机,完全复原,省心省力,好了就执行下面的命令

./configure -prefix /usr/local/Trolltech/QtEmbedded-4.7.4-arm -embedded arm -xplatform qws/linux-arm-g++

顺利通过执行,生成Makefile,现在make,make install,整个qt就安装到Trolltech目录了,重新修改/etc/profile增加以下内容

重启虚拟机,让所有设置生效,也可以在终端用source /etc/profile,让环境变量生效这样也行。

编译一个hello word的工程,验证一下,正常通过编译,把这个执行文件和/usr/local/Trolltech/QtEmbedded-4.7.4-arm/lib的库放进arm板跑起来,有时候会提示有缺失的库,这时候可以在交叉编译环境里面找有没有对应的库,有的话就可以直接放到arm板的对应lib里面,如果qt库和交叉编译的lib库放在其他自定义目录,需要设置arm板的库链接位置,指定到qt库和交叉lib的位置,可以通过env查看当前环境变量指定的地方。

编译出来的程序./test -qws可以正常执行,不过有个碍眼的鼠标,我们工程有按键不需要鼠标键盘,所以这里想办法把鼠标去除,网上有很多方法,有的说在配置qt源码的时候./configure -no-mouse******加上-no-mouse然后编译qt的源码重新安装,试了一下,有报错

 

./configure过程就有报错,仔细看一下./configure -help帮助菜单,的确没有找到-no-mouse的指令,也没有找到有关mouse的任何指令,估计要改qt源码可以实现去除鼠标的显示,不过我嫌太麻烦,就不重新安装qt了,直接在执行test的时候用./test -nomouse -qws来执行,成功的去除了鼠标,看一下效果

打完收工!

阅读(3384) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~