分类: LINUX
2008-11-21 17:50:58
Qt是Trolltech公司的一个产品。Trolltech是挪威的一家软件公司,主要开发两种产品:一种是跨平台应用程序界面框架;
另外一种就是提供给做嵌入式Linux开发的应用程序平台,能够应用到PDA和各种移动设备上。Qt和Qtopia分别是其中具有代表性的两个。
Qtopia基于Qt的嵌入式版本Qt/Embedded库的基础上,专门针对PDA、SmartPhone这类运行嵌入式Linux的移动计算设备和手持设备所开发的开放源码的一套应用程序包和开发库。
下面就开始移植工作。
我的工作环境为vmware linux,redhat完全安装,pxq255,交叉编译工具链为自带的hybus-arm-linux-R1.1.tar.gz(2.95.3),由于采用的是pxa255板子上自带的触摸屏驱动以及其提供的修改方法,所以如果按照下面的步骤做,这里也基本上遇到不了什么大的问题。小问题,仔细分析一下就可以解决掉了。
第一步:准备所需要的软件和交叉编译工具。
arm-linux-gcc-
e2fsprogs-1.35.tar.gz 用于编译生成libuuid库
tmake-1.13.tar.gz生成makefile
qt-embedded-
qt-x11-
qtopia-free-
第二步:安装交叉编译工具链
具体步骤(见上一篇blog)
第三步:安装tmake工具
tmake用于交叉编译生成qt应用程序的makefile,也可用于生成qt的本地makefile,区别在于设置TMAKEPATH路径的不同,一个用于arm,一个用于x86。
注意:在redhat9上面,tmake本来就有的,# rpm –qa tmake, 发现版本是tmake-1.7-8,但我们要使用11以上的版本,如果是11以上的版本可以不用安装。tmake–v 查看一下它的版本,有些版本比较老,建议换掉,同时把以前的tmake可执行文件删掉
# cd /home/tang/qt
# tar zxvf tmake-1.13.tar.gz
# vi tmake-1.13/lib/qws/linux/arm-g++/tmake.conf
做如下的修改:
TMAKE_LINK=arm-linux-g++ //将原来的arm-linux-gcc改成arm-linux-g++
TMAKE_LINK_SHLIBS=arm-linux-g++
# mv tmake-1.13 /usr/local/
# vi ~/.bash_profile添加以下一些信息
PATH=/usr/local/tmake-1.13/bin:$PATH
TMAKEPATH=/usr/local/tmake-1.13/lib/qws/linux-arm-g++
export PATH
export TMAKEPATH
# source ~/.bash_profile使环境变量生效,如果你刚才没有将原有的旧版本删去,这时候你发现使用# tmake –v的时候还是旧版本。这时候你可以# rm –rf /usr/bin/tmake将旧版本的tmake删去,然后# source ~/.bash_profile,这样就替换掉了系统上原来的tmake。
假如不用这种方法,可以直接用:
# export PATH=$PWD/tmake-1.13/bin:$PATH
# export TMAKEPATH=$PWD/tmake-1.13/lib/qws/linux-arm-g++
第四步:安装e2fsprogs
E2fsprogs 提供用于ext2 文件系统的工具。它还支持ext3 日志文件系统。E2fsprogs内含了许多标准工具,用于针对EXT2和EXT3文件系统的创建、修复、配置和debugger用途。
为arm编译libuuid库
# cd /home/tang/qt
# tar zxvf e2fsprogs-1.35.tar.gz
#cd e2fsprogs-1.35
# mkdir build
# cdbuild
# ../configure --enable-elf-shlibs--build=i386-linux --host=arm-linux--with-cc=/usr/local/Hybus-arm-linux-R1.1/bin/arm-linux-gcc --with-linker=/usr/local/Hybus-arm-linux-R1.1/bin/arm-linux-ld
# make
其中lib/libuuid.so.1.2 libuuid.so.1 libuuid.so即是我们需要编译的库
第五步:解压qtopia
#cd /home/tang/qt
#
tar –zxvf qtopia-free-
#cd
qtopia-free-
#export QPEDIR=$PWD
下面要用到QPEDIR这个环境变量
第六步:安装Qt/Embedded
#cd /home/tang/qt
# tar zxvfqt-embedded-
# cdqt-
# export QTDIR=$PWD
# export QTEDIR=$PWD
# export PATH=$PWD/bin:$PATH
# export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH
# vi
src/kernel/qwsmouse_qws.cpp
修改触摸屏驱动,如下:
************************************************************************************
class QCustomTPanelHandlerPrivate : public QWSMouseHandler {
Q_OBJECT
public:
QCustomTPanelHandlerPrivate(MouseProtocol, QString dev);
~QCustomTPanelHandlerPrivate();
private:
int mouseFD;
unsigned char prevstate;
private slots:
void readMouseData();
};
QCustomTPanelHandlerPrivate::QCustomTPanelHandlerPrivate( MouseProtocol, QString ){
#ifdef QWS_CUSTOMTOUCHPANEL
if ((mouseFD = open( "/dev/ts", O_RDONLY)) < 0) {
qWarning( "Cannot open /dev/ts (%s)", strerror(errno));
return;
} else {
sleep(1);
}
QSocketNotifier *mouseNotifier;
mouseNotifier = new QSocketNotifier( mouseFD, QSocketNotifier::Read, this );
connect(mouseNotifier, SIGNAL(activated(int)),this, SLOT(readMouseData()));
#endif
}
QCustomTPanelHandlerPrivate::~QCustomTPanelHandlerPrivate(){
if (mouseFD >= 0)
close(mouseFD);
}
struct CustomTPdata {
unsigned char status;
unsigned short xpos;
unsigned short ypos;
};
void QCustomTPanelHandlerPrivate::readMouseData()
{
if(!qt_screen)
return;
CustomTPdata data;
short data2[4]={0};
int ret;
ret=read(mouseFD,data2,sizeof(data2));
if(ret) {
data.status=data2[0];
data.xpos=data2[1];
data.ypos=data2[2];
QPoint q;
q.setX(data.xpos);
q.setY(data.ypos);
mousePos=q;
if(data.status && !prevstate) {
emit mouseChanged(mousePos,Qt::LeftButton);
} else if(!data.status&&prevstate){
emit mouseChanged(mousePos,0);
}
prevstate=data.status;
}
if(ret<0) {
qDebug("Error %s",strerror(errno));
}
}
***********************************************************************************
第七步:安装Qt/X11
编译qt-x11-
这里安装qtopia时只要编译qt-
#cd/home/tang/qt
# tar zxvfqt-x11-
# cdqt-
# vi configs/linux-g++-shared修改语句
SYSCONF_CXXFLAGS_X11= -I/usr/include/freetype2
#export QTDIR=$PWD
# export PATH=$PWD/bin:$PATH
# export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH
# ./configure –no-xft
# make
# make -C tools/qvfb/
# cp tools/qvfb/qvfbbin/
# ./bin/qvfb //////////////////////x11-FrameBuffer就运行起来了
#cp bin/uic$QPEDIR/bin/
# cp bin/uic$QTEDIR/bin/
第八步:安装Qtopia
#cd /home/tang/qt /qtopia-free-
# cp /home/tang/qt/e2fsprogs/build/lib/libuuid.so* /usr/local/Hybus-arm-linux-R1.1/lib/
# cp /home/tang/qt/e2fsprogs/build/lib/libuuid.so* /usr/local/Hybus-arm-linux-R1.1/arm-linux/lib/
# cp -a /home/tang/qt /e2fsprogs/lib/uuid include/
# export QTDIR=$QTEDIR
# export PATH=$PWD/bin:$PATH
# export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH
# cdsrc/
#./configure -xplatformlinux-arm-g++需要交叉编译
#make
这样交叉编译工作就完成了,剩下的就是可以将这些东西下载到板子上来运行了。
第九步:运行程序
首先,要关闭PXA255的XWindows,注释掉/etc/inittab文件最后一行代码
运行程序有两种方式,一种是把相应的库和应用程序下载到板子上,另一种是通过nfs方式。
将qt-
将qtopia-free-
Minicom登陆到开发板上。
下载步骤略。
在板子上运行qpe的过程如下:
# export LD_LIBRARY_PATH=/usr/local/qt-embedded/lib:$LD_LIBRARY_PATH
# export LD_LIBRARY_PATH=/usr/local/qtopia/lib:$LD_LIBRARY_PATH
# cd/usr/local/qtopia/bin
#./qpe–qws ////////////////////能够运行,表明移植成功。
通过nfs运行qpe
首先我们的pc机要开启nfs服务(略)
配置环境变量(脚本文件):
# export QTDIR=/mnt/qte
# export QPEDIR=/mnt/qtopia
# export LD_LIBRARY_PATH=$QTDIR/lib:$QPEDIR/lib:$LD_LIBRARY_PATH
# cd../qtopia-free-
#./qpe–qws运行qpe程序,移植成功
下载完成后就可以运行程序了。
congratulations!
不过这过程中也会出现一些问题,上面的命令有的空格符号标示的不太明显,所以结果有可能不对,这样就需要回头找原因到底是哪个环节出错误了,google一下就有了。
编绎Qtopia遇到的主要问题.
1) 版本问题: 以上所用的QTE和QPE的版本都必须严格对应, 稍有差错,编绎将不能通过. GCC的版本问题, 用最新的GCC4.1是不能编绎的, 这是一个已经报告的此版本GCC的BUG, 所以能做的只有卸掉此版本的GCC, 装上
2) 库问题: 编绎中可能会提示各种错误, 如未定义引用, 找不到头文件之类的错误, 其主要原因是缺少相应的库, 找到那个库, 编绎之,问题就会迎刃而解. 当然, 编绎库的过程中也可能会需要另外一个库, 这个过程是反复的.
ps:
参考主要来自于张老师的指导文档。