Chinaunix首页 | 论坛 | 博客
  • 博客访问: 121234
  • 博文数量: 41
  • 博客积分: 170
  • 博客等级: 入伍新兵
  • 技术积分: 265
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-09 16:11
文章分类

全部博文(41)

文章存档

2012年(41)

我的朋友

分类:

2012-05-30 15:11:26

为了移植QT下的email收发程序,历时一个多月,寻找调试,终于能看到QT4的桌面了,很是高兴.尽管还有很多工作要做,如鼠标,触摸屏,浏览器.
一.前言

很多人对qtopia-opensource-srcqtopia-core-opensource-src之间的区别不清楚,我也一直没彻底搞清楚,直到现在,对 最新的qt-embedded-linux-opensource-src-4.4.0.tar.gz与前面的区别也不清楚,周围专门研究过QT4的人很少,QT版本不断升级,从1.3.72.2,变化相当大,再到QT4,本人在2.2下做过移植,并且成功将浏览器konqueror移植到MIPS开发板上。

       上个月用户提出车载PC 上需要收发电子邮件,于是到处寻找,含sourceforge寻找有无支持QT email收发程序。已经记不清是否有支持qtemail收发程序,最后在网上看到了qtmail,找人要了代码,在2.2下做移植,发现缺乏很多头文件和库,一个串一个,进行不下去了,很是郁闷,半个月时间过去了。

       突然看到QT4的版本中有qtmail源代码,于是开始移植qt4,本人所用的是MIPS Linux,网上能看到的移植步骤很少且不详细。中途遇到了很多问题,继续郁闷。同事说,qt4的开源版只有库,没有界面,如果这样,还要去写一个界面,时间就长了。

       尽管能够编译(同事完成),但运行时报错,如GLIBC2.3 not found 等,大致知道是库版本偏低,但去制作一个GLIBC版本高的Mipsel交叉编译器又得需要一段时间。

       先找一个能够直接使用的高版本交叉编译器吧,然后再根据错误提示,一步一步终于看到了界面。效果和文“Fedora8上交叉编译qtopia4移植成功到s3c2410开发板”基本一样。

 

       对于qtopia-opensource-srcqtopia-core-opensource-src之间的区别,但通过生成的安装目录可以发现他们的区别。笔者试了一下,core版本没有桌面环境,只有库,可以运行examples目录下的例子在屏幕上看到单一应用程序的运行效果。具体如何运行见后面的说明。

 

qtopia-core-opensource-src

bin  demos  doc  examples  include  lib  mkspecs  plugins  translations

 

 

qtopia-opensource-src

bin  etc  help  i18n  lib  pics  plugins  qtopia_db.sqlite  qt_plugins  services  sounds

 

 

二.硬件平台

1.主机: PC机,512M内存以上。交叉编译需要很长时间,大约2-3个小时,建议机器配置高一点,否则要等待太长时间。

 

2.目标机:聚芯Erasoc-1000C开发板(中科院计算所)

 

三.移植软件资源

 

1.  Red Hat Linux 9.0(主机操作系统)

笔者现在fedora core 5上面进行编译,出现了大量的警告及错误,于是改到了redhat linux 9上。

 

/mips-qtopia-opensource/install/qtopiacore/qt/src/corelib/global/qglobal.cpp:2240:   instantiated from here

../../include/QtCore/../../../../../install/qtopiacore/qt/src/corelib/thread/qthreadstorage.h:103: 警告:提领类型双关的指针将破坏强重叠规则

/mips-qtopia-opensource/install/qtopiacore/qt/src/corelib/thread/qthread_unix.cpp: In static member function ‘static QThreadData* QThreadData::current()’:

/mips-qtopia-opensource/install/qtopiacore/qt/src/corelib/thread/qthread_unix.cpp:61: 警告:提领类型双关的指针将破坏强重叠规则

/mips-qtopia-opensource/install/qtopiacore/qt/src/corelib/thread/qthread_unix.cpp: In static member function ‘static void* QThreadPrivate::start(void*)’:

/mips-qtopia-opensource/install/qtopiacore/qt/src/corelib/thread/qthread_unix.cpp:119: 警告:类型双关作用在不完全类型上可能破坏强重叠规则

/mips-qtopia-opensource/install/qtopiacore/qt/src/corelib/kernel/qobject.h: In function ‘QList qFindChildren(const QObject*, const QString&) [with T = QObject*]’:

/mips-qtopia-opensource/install/qtopiacore/qt/src/corelib/kernel/qobject.cpp:2775:   instantiated from here

/mips-qtopia-opensource/install/qtopiacore/qt/src/corelib/kernel/qobject.h:370: 警告:提领类型双关的指针将破坏强重叠规则

../../include/QtCore/../../../../../install/qtopiacore/qt/src/corelib/kernel/qobject.h: In function ‘QList qFindChildren(const QObject*, const QString&) [with T = QWidget*]’:

/mips-qtopia-opensource/install/qtopiacore/qt/src/gui/kernel/qwidget.cpp:4368:   instantiated from here

../../include/QtCore/../../../../../install/qtopiacore/qt/src/corelib/kernel/qobject.h:370: 警告:类型双关作用在不完全类型上可能破坏强重叠规则

/mips-qtopia-opensource/install/qtopiacore/qt/src/gui/kernel/qapplication_x11.cpp: In function ‘void qt_set_input_encoding()’:

/mips-qtopia-opensource/install/qtopiacore/qt/src/gui/kernel/qapplication_x11.cpp:719: 警告:提领类型双关的指针将破坏强重叠规则

/mips-qtopia-opensource/install/qtopiacore/qt/src/gui/kernel/qclipboard_x11.cpp: In function ‘bool qt_check_selection_sentinel()’:

 

 

2gcc-3.4.1.tar.gz(主机编译器)

 

[root@srv3 work2]# gcc -v

Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/specs

Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --host=i386-redhat-linux

Thread model: posix

gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)

 

 

 

3mipsel-unkown-gnu-linux-gcc.tar.bz2(交叉编译器)

 

4tslib-1.3.tar.bz2(管理目标平台的触摸屏)(此版本中暂未考虑)

 

5qtopia-opensource-src-4.2.0.tar.gz(包含QtQtopia core)

 

四.Qtopia4移植过程

交叉编译器的安装略。

本人所用的交叉编译环境为mipsel-linux-gcc3.4.3mipsel-linux-g++2.95.3,尚未来得及在高本版上测试。

 

编译前约定:工作目录为

/work2

 

[root@srv3 work2]# mkdir target

[root@srv3 work2]# tar zxvf qtopia-opensource-src-4.2.0.tar.gz

[root@srv3 work2]# mv qtopia-opensource-4.2.0 install

 

[root@srv3 install]# cd qtopiacore/qt/mkspecs/qws/linux-mips-g++

[root@srv3 linux-mips-g++]# vi qmake.conf

 

      5 MAKEFILE_GENERATOR      = UNIX

      6 TEMPLATE                = app

      7 CONFIG                  += qt warn_on release link_prl

      8 QT                      += core gui network

      9 QMAKE_INCREMENTAL_STYLE = sublib

     10

     11 #QMAKE_CC               = mipsel-linux-gcc

     12 QMAKE_CC                = mipsel-unknown-linux-gnu-gcc

     13 QMAKE_LEX               = flex

     14 QMAKE_LEXFLAGS          =

     15 QMAKE_YACC              = yacc

     16 QMAKE_YACCFLAGS         = -d

     17 #QMAKE_CFLAGS           = -pipe -mips32

     18 QMAKE_CFLAGS            = -pipe -mips2

 

[root@srv3 install]# cd src/libraries/qtopiabase/

[root@srv3 qtopiabase]# cp -f custom-linux-cassiopeia-g++.cpp custom-linux-mips-g++.cpp

[root@srv3 qtopiabase]# cp -f custom-linux-cassiopeia-g++.h custom-linux-mips-g++.h

 

 

 

 

3) 修改时区信息(注:此部分还未测试)

 

# vi src/libraries/qtopia/qtimezone.cpp

 

114行的 /usr/share/zoneinfo/ 改为/mnt/yaffs/target/zoneinfo/ ,保存退出。

 

# vi src/settings/systemtime/settime.cpp

 

318行的 /usr/share/zoneinfo/ 改为/mnt/yaffs/target/zoneinfo/ ,保存退出。

 

4) 裁减Qtopia core的库

 

# vi qtopiacore/qconfig-qpe.h

 

首先注释掉关于鼠标光标的宏定义,让程序运行时,触摸屏中央有光标出现:

// Qtopia Core

/*

#ifndef QT_NO_QWS_CURSOR

#  define QT_NO_QWS_CURSOR

#endif

*/

/*

#ifndef QT_NO_QWS_MOUSE

#  define QT_NO_QWS_MOUSE

 

#endif

 

#ifndef QT_NO_QWS_MOUSE_AUTO

#  define QT_NO_QWS_MOUSE_AUTO

#endif

 

*/

其它宏定义根据需要进行注释。

保存后将qconfig-qpe.h拷贝到global目录。

# cp qtopiacore/qconfig-qpe.h qtopiacore/qt/src/corelib/

 

global/qconfig-qpe.h

 

注释掉其他文件里的QT_NO_QWS_CURSOR的定义

# vi qtopiacore/qt/src/corelib/global/qfeatures.h

 

注释掉如下内容:

/*

#if !defined(QT_NO_QWS_CURSOR) && (defined(QT_NO_CURSOR))

#define QT_NO_QWS_CURSOR

#endif

*/

 

保存退出。

# vi qtopiacore/qt/src/corelib/global/qglobal.h

注释掉以下内容

//#    define QT_NO_QWS_CURSOR

 

 

配置源码包

 

echo "yes" |../install/configure -edition phone -xplatform linux-mips-g++ -arch mips -no-qvfb  -release -displaysize 240x320 -no-modem -quicklaunch -defaultbuttons phone -image /work2/qte4.2_dest -prefix /work2/qte4.2_dest/ -no-bluetooth -no-drm -no-infrared -extra-qt-config "-qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libjpeg" -extra-qtopiacore-config '-depths 16,24 '

 

主要配置选项解说如下:

-xplatform linux-mips-g++ -arch mips

目标平台为mips-linux,体系结构为mips

-no-qvfb

目标平台已支持framebuffer,因而不使用虚拟帧缓冲。

-extra-qtopiacore-config

Qtopia core 配置选项。

-xplatform qws/linux-mips-g++ -embedded mips

目标平台编译配置文件使用qtopiacore/qt/mkspecs/qws/linux-mips-g++目录下的配置文件,嵌入式平台为mips

 

 

[root@srv3 work2]# diff qmake.conf1 qmake.conf2

11c11

< QMAKE_CC              = mipsel-unknown-linux-gnu-gcc

---

> QMAKE_CC              = mipsel-linux-gcc-3.4.3

16c16

< QMAKE_CFLAGS          = -pipe -mips32

---

> QMAKE_CFLAGS          = -pipe -mips2

 

 

编译源码包

 

执行如下命令:

# make

编译过程中出现了无数的警告,如变量未使用等。还出现了十个左右的错误,导致编译停止。比如,还有很多,没有一一记录,目前采取的做法是,将错误行注释掉,显然,这不是很好的解决办法,但为了让编译进行下去,先只能这样,如果注释的部分没有用到,这种方法也时可以的。笔者有两点疑惑,仍需要时间去分析和学习,一是为什么基于arm编译和基于mips编译会出现如此大的不同,有些在arm中的错误在mips中没有,而mips下出现的错误在arm下没有出现,而且arm下编译出现的错误和警告要远少于mips下编译出现的错误和警告,可能这与编译器及版本还有gcc的版本以及glibc的版本有关。

 

/work2/install/qtopiacore/qt/tools/qvfb/qwssignalhandler.cpp: In member

   function `QWSSignalHandler::QWSSignalHandler()':

/work2/install/qtopiacore/qt/tools/qvfb/qwssignalhandler.cpp:35: warning: unused

   variable `void (*old)(int)'

/work2/install/qtopiacore/qt/tools/qvfb/qwssignalhandler.cpp: In static member

   function `static void QWSSignalHandler::handleSignal(int)':

/work2/install/qtopiacore/qt/tools/qvfb/qwssignalhandler.cpp:61: `class

   QWSSignalHandler' has no member named `oldHandlers'

make[6]: *** [.obj/release-shared/qwssignalhandler.o] Error 1

make[5]: *** [redirect_all] Error 2

make[4]: *** [all] Error 2

make[3]: *** [sub-tools-qt-qvfb] Error 2

make[2]: *** [all] Error 2

make[1]: *** [qtopia_all] Error 2

make: *** [all] Error 2

 

 

 

/work2/install/qtopiacore/qt/tools/qvfb/qwssignalhandler.cpp: In constructor

   `QWSSignalHandler::QWSSignalHandler()':

/work2/install/qtopiacore/qt/tools/qvfb/qwssignalhandler.cpp:36: `oldHandlers'

   undeclared (first use this function)

/work2/install/qtopiacore/qt/tools/qvfb/qwssignalhandler.cpp:36: (Each

   undeclared identifier is reported only once for each function it appears

   in.)

/work2/install/qtopiacore/qt/tools/qvfb/qwssignalhandler.cpp: In static member

   function `static void QWSSignalHandler::handleSignal(int)':

/work2/install/qtopiacore/qt/tools/qvfb/qwssignalhandler.cpp:61: `class

   QWSSignalHandler' has no member named `oldHandlers'

make[6]: *** [.obj/release-shared/qwssignalhandler.o] Error 1

make[5]: *** [redirect_all] Error 2

make[4]: *** [all] Error 2

make[3]: *** [sub-tools-qt-qvfb] Error 2

make[2]: *** [all] Error 2

make[1]: *** [qtopia_all] Error 2

make: *** [all] Error 2

 

 

 

/work2/install/qtopiacore/qt/src/gui/embedded/qmouse_qws.cpp: In method `void

QWSCalibratedMouseHandler::calibrate (const QWSPointerCalibrationData *)':

/work2/install/qtopiacore/qt/src/gui/embedded/qmouse_qws.cpp:477: `log2' undeclared (first use this

function)

/work2/install/qtopiacore/qt/src/gui/embedded/qmouse_qws.cpp:477: (Each undeclared identifier is

reported only once for each function it appears in.)

make[6]: *** [.obj/release-shared-emb-mips/qmouse_qws.o] Error 1

make[5]: *** [redirect_all] Error 2

make[4]: *** [all] Error 2

make[3]: *** [sub-libraries-qtopiacore-gui] Error 2

make[2]: *** [all] Error 2

make[1]: *** [qtopia_all] Error 2

make: *** [all] Error 2

 

 

4.安装编译后源码包

# make install

 

编译安装完成后,在/work2/qte4.2_dest/目录下产生各个目标文件。

[root@srv3 qte4.2_dest]# ls

bin  etc  help  i18n  lib  pics  plugins  qtopia_db.sqlite  qt_plugins  services  sounds

5.建立时区信息

 

# cd $QTOPIATARG

# mkdir zoneinfo

# cp -a /usr/share/zoneinfo/* $QTOPIATARG/zoneinfo/

 

五.移植到开发板上

   我的开发板是用tftp方式启动Linux内核,根文件系统是通过NFS方式影射的(在内核中指定了根文件系统的路径)

PMON>ifaddr rtl0 10.2.2.14

PMON>boot tftp://10.2.2.76/vmlinux

 

10.2.2.14为开发板的IP10.2.2.76PC机的IP,两者用交叉线互连。提前配置好TFTP服务,并指定好TFTP的根路径,将编译好的内核2.42.6均可,如需要支持触摸屏,内核中必须提前移植和编译好触摸屏驱动程序。

 

我的根文件系统在/nfs/redhat1目录下。

在该目录下建立脚本文件qt.sh,内容如下

 

 

#!/bin/ash

export T_ROOT=/tslib

export LD_LIBRARY_PATH=$T_ROOT/lib 

export TSLIB_CONSOLEDEVICE=none

export TSLIB_FBDEVICE=/dev/fb0

export TSLIB_TSDEVICE=/dev/ts

export TSLIB_TSEVENTTYPE=H3600

export TSLIB_CALIBFILE=/etc/pointercal

export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf

export TSLIB_PLUGINDIR=$T_ROOT/plugins

 

#export QWS_MOUSE_PROTO=TPanel:/dev/ts      //支持触摸屏

export QWS_MOUSE_PROTO=MouseMan:/dev/mouse  //支持鼠标

export TOP=/work/qte4.2_dest

export QTDIR=$TOP

export QPEDIR=$TOP

export KDEDIR=$TOP/kde

export HOME=/root

 

export PATH=$PATH:$TOP/bin

#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/target/lib

export LD_LIBRARY_PATH=$TOP/lib:$LD_LIBRARY_PATH

dmesg -n 1

#qpe >/dev/null 2>&1

qpe

 

保存退出,修改用户使用权限:

# chmod 777 qt.sh

 

值得注意的是,必须保证主机上启动了NFS服务,将主机的/nfs/redhat1目录挂载到目标机的/目录下。通过察看一下,如果看到下面的显示,说明是正常的。

[root@localhost /]# showmount -e localhost

Export list for localhost:

/nfs/redhat1 10.2.2.*

 

然后在开发板上运行./qt.sh即可。

总结:这几天潜心研究嵌入式,杂事一律暂停,发现效率相当的高,当然也连续熬了几天的夜。正确的方向+正确的方法+持之以恒一定能做成一件有价值的大事。

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