您的位置:首页 > 编程语言 > Qt开发

Qt/Embedded 2.3.10 到PXA270上的移植

2007-04-20 13:15 225 查看
很高兴,力尽艰辛磨难,终于把qte移植到了PXA270板子上,可以跑helloworld了。第一次接触嵌入式开发,又要移植嵌入式GUI,真是难为我了,虽然很遗憾移植之后发现qte并不支持OpenGL,离我的3D开发还很远,但还是挺开心的,移植期间收获不少,自己对板子也慢慢熟悉起来了。衷心感谢帮助过我的网友。下面把我的移植过程说一下。

1.准备相关软件包和交叉编译工具
由于这个qte的版本比较第,移植实在麻烦,要准备的相关的软件包很多:
e2fsprogs-libs-1.37 //ext2 文件系统工具包,要用到了其中的 libuuid.so 动态连接库
libjpeg-iwmmx //jepg编解码库
tslib //触摸屏工具,如果有触摸屏的话,不过我的还触摸屏没弄成功
qt-embedded-2.3.10-free //主角
tmake-1.13 //make file 生成工具

说明:libjpeg-iwmmx可以根据情况舍去不要,因为我用的编译器是armv4l-unknown-linux编译器,本身带有jpeg编解码库,所以我没用这个包,其实最主要的一个原因是我用armv4l-unknown-linux交叉编译libjpeg-iwmmx 会有一个错误,好像是什么 不能识别 function prototype 之类的,然后看到编译器自己带有,就不去理它了。不过要注意的是,你的嵌入式的文件系统里的jpeg编解码库的版本必须和你交叉编译链接是一样的,否则运行qte程序会报错。
关于交叉编译工具,由于我的板子是PXA270的,所以选择了比较高版本的armv4l-unknown-linux 编译器,和qte 和 qtx11 默认的不一样的。不过不要紧,设置好就可以了。

假设我的那些软件包释放后都放在/root 下,然后也在这个目录下建立e2fs-install 和tslib-install目录(要编译的jepg库的话也建立一个jpeg-install目录)存放对应工具包编译后的库。
交叉编译器安装在/opt/host/armv4l/ 下。

2.交叉编译e2fsprogs-libs-1.37
我直接在e2fsprogs-libs-1.37目录建立一下的脚本,执行就可以了
#--------------------------------------------------------------------------------------------------------
#!/bin/sh
export E2FSLIB=`pwd`
cd ..
export E2FSLIBINST=`pwd`/e2fs-install
cd $E2FSLIB
echo $E2FSLIB
echo $E2FSLIBINST
export PATH=/opt/host/armv4l/bin:$PATH
OLDCC=$CC
export CC=armv4l-unknown-linux-gcc
./configure --host=arm-linux --enable-elf-shlibs --prefix=$E2FSLIBINST
make install
export CC=$OLDCC
#---------------------------------------------------------------------------------------------------------

3.交叉编译tslib
在tslib目录执行以下脚本:
#---------------------------------------------------------------------------------------------------------
#!/bin/sh
export TSLIBDIR=`pwd`
cd ..
export TSLIBINST=`pwd`/tslib-install
cd $TSLIBDIR
export PATH=/opt/host/armv4l/bin:$PATH
OLDCC=$CC
export CC=armv4l-unknown-linux-gcc
./autogen.sh --host=arm-linux --prefix=$TSLIBINST
make install
export CC=$OLDCC
#---------------------------------------------------------------------------------------------------------

4.交叉编译jpeg库
原理一样,由于我没有编译,这里就不说了。

5.交叉编译qte
在qt-embedded-2.3.10执行以下脚本:
#---------------------------------------------------------------------------------------------------------
#!/bin/sh
export QTEDIR=`pwd`
export QTDIR=$QTEDIR
export TMAKEDIR=/root/tmake-1.13
export TMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g++
export PATH=/opt/host/armv4l/bin:$PATH
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

export E2FSLIBINST=/root/e2fs-install

export JPEGINST=/root/jpeg-install

export TSLIBINST=/root/tslib-install

./configure -xplatform linux-arm-g++ -qconfig qpe -no-qvfb -depths 4,8,16,32 -system-jpeg -gif -tslib -thread -I$E2FSLIBINST/include -I$TSLIBINST/include -L$E2FSLIBINST/lib -L$TSLIBINST/lib
make -j4 sub-examples
#---------------------------------------------------------------------------------------------------------

说明:由于我使用的是arm4l-unknown-linux-g** 系列,而QTE源码默认使用的是 arm-linux-g** 系列,所以我对 $QTEDIR/configs 下的linux-arm-g++-shared文件进行了修改,把arm-linux-** 替换成 arm4l-unknown-linux-** 了,否则会用arm-linux来编译。其次也照样修改了$TMAKEDIR/lib/qws/arm-linux-g++目录下的tamke.conf 文件,编译例子的时候有用。

执行编译后,漫长的过程,可以去小睡一下。之后会在qte的目录的lib下生成libqte的动态链接库,这正是我们想要的。

6.交叉编译qte程序
可以在qte目录的sample里拿个例子来交叉编译测试,也可以自己写个。我写了一个helloworld的测试程序:
#---------------------------------------------------------------------------------------------------------
#include <qapplication.h>
#include <qlabel.h>
int main(int argc, char **argv)
{
QApplication app (argc, argv);
QLabel *hello = new QLabel("<h2><fontcolor=blue>Hello<i>Qt/Embedded!</i> </font> </h2>", 0);
app.setMainWidget(hello);
hello->show();
return app.exec();
}
#---------------------------------------------------------------------------------------------------------
存为hello.cpp,然后设置环境变量:
export QTDIR=/root/qt-2.3.10
export TMAKEPATH=/root/tmake-1.13/lib/qws/linux-arm-g++
export PATH=/root/tmake-1.13/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:/root/tslib-install/lib:/root/jpeg-install/lib:$LD_LIBRARY_PATH
export QTINCLUDE=$QTDIR/include
export PATH=$QTDIR/bin:$PATH
export PATH=/opt/host/armv4l/bin:$PATH

生成.pro文件
progen -t app.t -o hello.pro #progen 是tmake里的一个脚本,可以生成.pro文件
编辑hello.pro文件为
#---------------------------------------------------------------------------------------------------------
TEMPLATE = app
TARGET = hello
CONFIG = qt warn_on release
DEPENDPATH = $QTINCLUDE
SOURCES = hello.cpp
INTERFACES =
#---------------------------------------------------------------------------------------------------------
生成Makefile
tmake -o Makefile hello.pro
然后make一下就可以了。

7.nfs挂载运行qte库及qte程序
假如我把qte库及相关库放在/root/qteshared 目录的lib目录下:
cp $QTDIR/lib/libqte.so* /root/qteshared/lib
cp /root/e2fs-install/libuuid.so* /root/qteshared/lib
cp /root/tslib-install/libts-0.0.so* /root/qteshared/lib
(如果编译了jpeg库也一样操作)
并且/root/qteshared设置成nfs共享了,我的hello程序放在/root/qteshared下,然后我在minicom下挂载这个目录:

mount -t nfs -o intr,nolock,rsize=1024,wsize=1024 192.168.2.111:/root/qteshared /qt/

192.168.2.111是pc机子的ip,/qt这个目录是我板上一个目录,“rsize=1024,wsize=1024 ”设置很重要,这东西耽误了我整个星期,没设置对的时候,一运行qte程序就出现:
nfs: server ********* not responding, still trying.
的错误。但运行控制台print hello world 是可以 的。就这样郁闷了四五天,才无意中加了这个选项,终于可以了。原来用32768的,看网上有些人是这样设置的,但也不行,就是要1024,不知道是不是跟板子有关,大家设置的时候要多设置几个试试,要不又跟我一样郁闷了。
还要注意的是板子linux内核一定要设置成本地socket文件支持,因为qte程序运行时framebuffer 要用。在内核配置make menuconfig 命令,在networking->networking options->Unix domain sockets 设置就可以了。
还有一点,板子上文件系统的/tmp目录要挂载成tmpfs可写的,在启动文件linuxrc里可以进行这样的操作。否则qte程序运行不了。如果要触摸屏支持,/etc目录好像也是要可写的。

挂载成功的话就可以设置板子上的环境变量:
export LD_LIBRARY_PATH=/qt/lib:$LD_LIBRARY_PATH
export QTDIR=/qt
然后
cd /qt
./hello -qws
行运的话你就可以看到qte的程序界面显示在LCD上了。
就此结束,其实回头看很简单,很多时候都卡在一个点上而已。接下来我还要移植有opengl支持的qtopia core 4.3,希望不要再有这么多挫折了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: