虚拟机版本:VMare8.0.0
虚拟机系统:Ubuntu10.0
QT源码版本:qt-embedded-free-3.3.8
交叉编译工具:arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu
开发板:ATMEL9263
注:该交叉编译工具在后期编译QT文件在进行编译的时候,要链接到静态库libjpeg,但是出错,后来又改用交叉编译工具arm-2009q1,这个交叉编译工具是从同事那里拷过来的,也是开发板供应商提供的,菜鸟看了下,它的文件大小比前者要大,里面包含的库文件要多一点,在下面的操作中,菜鸟按照官方的交叉编译工具进行操作,因为在编译成功动态库以后,您可能不需要连接到libjpeg文件。
这次对QT环境的配置和上次差不多,不同之处就是QT源码版本和交叉编译工具链不同,配置过程大同小异,但是过程中遇到的问题却有很大的差别,所以菜鸟在此把配置过程和遇到问题列出来,以便大家和自己以后参考。
一、安装交叉编译工具
1.下载交叉编译工具
下载交叉编译工具有两种方法,一种是通过Ubuntu自带的命令进行下载,另外一种是直接登录到网站进行下载。
1.1在ubuntu上利用wget命令下载交叉编译工具,命令为:
wget http://www.codesourcery.com/sgpp/lite/arm/portal/package4571/public/arm-none-linux-gnueabi/arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
在下载的过程中完全可以按
wget -c http://www.codesourcery.com/sgpp/lite/arm/portal/package4571/public/arm-none-linux-gnueabi/arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
命令wget是一个非交互式的命令行工具,用于从网络上检索文件并自动下载,支持HTTP、HTTPS、FTP三个最常用的TCP/IP协议。
1.2浏览器网页直接下载交叉编译工具
打开浏览器,在浏览器网址输入栏中直接输入上述地址,就会弹出下载提示,然后保存到相应位置。下载地址重复列于下方:
http://www.codesourcery.com/sgpp/lite/arm/portal/package4571/public/arm-none-linux-gnueabi/arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
注意在利用这两种方式下载过程是很慢的,基本是30Kb左右,所以您不要觉得是自己的网速出现了问题而中断下载。
2.解压交叉编译工具
利用ubuntu命令下载的交叉编译工具被放在当前目录,而利用浏览器网页下载的交叉编译工具要拷贝的虚拟机中。在虚拟机中把它解压出来,解压命令为:
tar -xjvf arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
解压成功后会在当前目录生成arm-2009q1文件夹。
特别注意生成的目录中arm-2009q1中,中间有符号:-,还有最后那个符号是数字1,而不是小写字母l,这点您务必不要弄错,因为在后面会据此配置环境变量,如果出错,配置好了环境变量,该工具也不能使用(本菜鸟就因为这个小小的细节而浪费了两天的时间去找原因,真汗⊙﹏⊙b)。
3.配置环境变量
打开文本bashrc,命令为:vim ~/.bashrc,如果您的虚拟机中没有安装vim,可以利用命令sodu apt-get install vim安装。
打开文本后,在最后增加交叉编译工具路径。注意,你的交叉编译工具解压在什么路径就用相应的路径进行配置,本菜鸟的工具是在/usr/local/arm/目录下,所以配置如下:
export PATH=/usr/local/arm/arm-2009q1/bin:$PATH
保存退出,然后重启虚拟机或者source ~/.bashrc,是配置生效。
4.检验交叉编译工具是否安装成功
按照上述方法配置成功以后,打开虚拟机终端,在终端打印arm-然后按tab键,看看是否有arm-none-linux-gnueabi- 字样自动对齐,如果有的话,恭喜您,你的交叉编译工具已经安装成功,您可以进行下一步的工作了。如果没有,菜鸟希望您不会犯像本菜鸟一样的低级的错误。
二、下载、配置QT源文件并编译
1.菜鸟下载QT源文件的地址是:http://qt-project.org/downloads/,本地址里面有各种版本的QT开源文件,尽可下载。菜鸟下载的版本如开始所述。
将下载的源文件解压到您的QT目录,菜鸟的QT目录为:/usr/local/arm/,把源文件解压出来,解压命令为:
tar -xjvf qt-embedded-free-3.3.8.tar.bz2,解压成功后会在解压目录生成目录文件:qt-embedded-free-3.3.8,为了以后方便配置,菜鸟把该目录名称改为:qte3.3.8,修改命令为:mv qt-embedded-free-3.3.8 qte3.3.8,所以菜鸟的QT目录为/usr/local/arm/qte3.3.8
2.在开始编译源文件之前要进行相关环境配置
2.1配置环境变量
QT环境变量有两个,一个是QT目录路径,另一个是QT库路径,另外还有QT自带的bin命令,根据本菜鸟个人的文件文件位置,打开文件bashrc,在最后添加配置如下:
export QTDIR=/usr/local/arm/qte3.3.8
export QTEDIR=$QTDIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/arm/qte3.3.8/lib:$LD_LIBRARY_PATH
保存退出。
2.2配置qmake(也即配置交叉编译工具)
在mkspecs/qws/下建立arm-none-linux-gnueabi目录
按照菜鸟自己的环境,配置过程如下:
进入到QT的目录,命令为:cd /usr/local/arm/qte3.3.8
进入目录qws,并创建文件夹,命令为:
cd mkspecs/qws/
mkdir arm-none-linux-gnueabi
把mkspecs/qws/linux-arm-g++下的qmake.conf和qplatformdefs.h复制到mkspecs/qws/arm-none-linux-gnueabi目录下
然后修改qmake.conf文件,把文件里面的编译器指定为arm-none-linux-gnueabi
用arm-none-linux-gnueabi-gcc和arm-none-linux-gnueabi-g++替代以下的arm-linux-gcc和arm-linux-g++
也即将:
QMAKE_CC = arm-linux-gcc
QMAKE_CXX = arm-linux-g++
QMAKE_LINK = arm-linux-g++
QMAKE_LINK_SHLIB = arm-linux-g++
替换为:
QMAKE_CC = arm-none-linux-gnueabi-gcc
QMAKE_CXX = arm-none-linux-gnueabi-g++
QMAKE_LINK = arm-none-linux-gnueabi-g++
QMAKE_LINK_SHLIB = arm-none-linux-gnueabi-g++
保存退出,至此QT环境变量已经配置好,当然还要关机重启或者source一下下啦。
3.编译源文件
以上环境变量配好以后,就开始编译QT的的源文件了,小伙伴,您是否很期待这一刻呢。本菜鸟在配置的时候遇到了很多问题,可能与你有所不同,下面菜鸟把配置过程和遇到的问题以及解决方法列出来,以供您参考。虽然本菜鸟不能保证你成功,但是一定能保证给您一丢丢失败的教训。
3.1对源文件进行configure
进入QT源文件目录,菜鸟的路径为:/usr/local/arm/qte3.3.8
命令为:cd /usr/local/arm/qte3.3.8
在该目录中有configer文件,对其进行运行,运行命令如下,当然里面的好多参数本菜鸟也不太清楚,有待以后深入学习。
./configure -xplatform qws/arm-none-linux-gnueabi -no-cups -no-stl -no-qvfb -depths 4,8,16,32 -qt-gif -embedded arm -disable-sql
这一步本菜鸟没有出现问题,只有一个warning,具体如下:
WARNING: Failure to find: .moc/release-static-mt-emb-x86/allmoc.cpp
该warning官方已经给出解释:This is not a problem. It happens everytime Qt/embedded is configured.所以可以对该warning不予理会。
3.2make或者make sub-src
这一步问题比较多,本菜鸟破费了一番周折,最终才完成make。
3.2.1问题一:
*** [.obj/release-shared-emb-arm/allmoc.o] Error 1
qstring.h:199: error: cannot bind packed field '((QChar*)this)->QChar::ucs' to 'ushort&'
该问题本菜鸟也看不懂神马意思,反正拷贝下来在网上各种搜答案,最终解决方法如下:
在/include/qstring.h文件中,把其中199行的一句话改下下就可以了。
//ushort &unicode() { return ucs; }
ushort &unicode() {ushort& tmp = ucs; return tmp; }
3.2.2问题二:
/usr/local/arm/qte3.3.8/bin/uic: Command not found
这个问题让菜鸟很头痛,因为发现这个问题后本菜鸟凭借仅有的点点经验,还是知道怎么解决,
菜鸟去qte3.3.8/tools/designer/uic目录下,make下,于是在qte3.3.8/bin目录下生成了uic文件,于是本菜鸟继续走上了make这条不归大道,可是又报错了。错误如下:/usr/local/arm/qte3.3.8/bin/uic: 1: Syntax error: word unexpected (expecting ")"),说是缺少一个符号:),这让本菜鸟很是捉急,因为这是通过源文件自动生成的文件,怎么会有错呢,但是它就是不讲理的出错了,所以菜鸟和计算机没法讲理去,它可以胡来,但是菜鸟却不能。最后菜鸟在同事那边拷贝过来一个uic文件,再继续编译算是把这个错误给跳过了。
3.2.3问题三:
/usr/local/arm/qte3.3.8/bin/uic: error while loading shared libraries: libqte-mt.so.3: cannot open shared object file: No such file or directory
那个问题刚走,这个问题又来,但是无Bug何来程序员啊。有Bug在就有程序员在。
菜鸟去库里看下,qte3.3.8/lib里面确实没有libqte-mt.so.3,于是新建ibqte-mt.so.3并将其软连接到已有的库上,命令为:ln -s libqte.so.3.3.8 libqte-mt.so.3,然后继续make,但是还是不行,折腾好久,还是没有解决,菜鸟就是菜鸟,问题变点花样就解决不了了。
最后不得已菜鸟用make sub-src命令进行make,然后,你懂得,就成功了。这两个命令是有点小区别的,前者将精简编译QT源文件,过程中源文件中的有些类并没有被编译进去,而后者要把整个文件编译进去,至于make的话,问题怎么解决,本菜鸟确实无能为力,希望各路大神指教。
至此,菜鸟的QT源文件已经编译完成(如果这算是完成的话),下一步就是把本菜鸟工作上的QT文件进行编译。
三、编译菜鸟工作中的QT文件并移植到开发板
1.编译菜鸟工作中的QT代码
本菜鸟工作上用的QT也就是几个显示页面,当然是以前同事已经写好的代码,界面分别显示总表、用户表、无功补偿、保护器、设置信息,各个界面之间可以互相跳动。这个代码菜鸟还没有仔细看,把环境配置好以后再仔细慢慢看,慢慢调试。
里面Makefile文件也已经写好了,直接make就可以,但是不make不要紧,一make就出错了,错误信息如下:
arm-none-linux-gnueabi/bin/ld: cannot find /lib/libpthread.so.0 inside /usr/local/arm/arm-2009q1/bin/../arm-none-linux-gnueabi/libc
collect2: ld returned 1 exit status
于是菜鸟在同事配置的虚拟机中把该静态文件拷贝出来,放在菜鸟的虚拟机的相应位置,继续make,但是还是却文件,反正菜鸟每次把相应的文件拷出来以后,都还会缺少其他的文件,索性菜鸟不拷贝了,直接把交叉编译工具给换掉了,换成开发板供应商提供的交叉编译工具,后来,你们懂得,编译成功了。
2.将文件移植到开发板
将上述编译好的文件拷贝到开发板上,菜鸟的开发板QT目录为/qt,相应的库文件目录为:
/qt/lib,将生成的动态库libqte.so.3.3.8放到/qt/lib下,然后配置环境变量,分别如下:
export QTDIR=/qt
export LD_LIBRARY_PATH=/qt/lib
然后把生成的QT文件cloud(菜鸟编译后QT文件后的文件名)拷贝到板子上,对它运行,命令为:./cloud -qws -nomouse
于是,你们懂得,成功了。
QT环境配置以及移植到开发板上已经成功了,但是这整个过程基本上是按照网上的步骤进行的,对于为什么这么做以及每一步配置参数的含义还是比较模糊的,所以本菜鸟在以后学习QT的过程中还要仔细学习配置过程的详细知识。知其然并知其所以然。
参考文章:
http://blog.csdn.net/oqidian12345/article/details/8968078
http://blog.chinaunix.net/uid-20697149-id-1891506.html
http://blog.sina.com.cn/s/blog_416bf8c201012dq5.html
http://blog.csdn.net/zozowit/article/details/2200948