免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 968 | 回复: 0
打印 上一主题 下一主题

redhat9上移植qtopia-opensource-src-4.2.0到聚芯开发板 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-17 21:24 |只看该作者 |倒序浏览

为了移植QT下的email收发程序,历时一个多月,寻找调试,终于能看到QT4的桌面了,很是高兴.尽管还有很多工作要做,如鼠标,触摸屏,浏览器.
一.前言
很多人对qtopia-opensource-src和qtopia-core-opensource-src之间的区别不清楚,我也一直没彻底搞清楚,直到现在,对 最新的qt-embedded-linux-opensource-src-4.4.0.tar.gz与前面的区别也不清楚,周围专门研究过QT4的人很少,QT版本不断升级,从1.3.7到2.2,变化相当大,再到QT4,本人在2.2下做过移植,并且成功将浏览器konqueror移植到MIPS开发板上。
       上个月用户提出车载PC 上需要收发电子邮件,于是到处寻找,含sourceforge寻找有无支持QT的 email收发程序。已经记不清是否有支持qt的email收发程序,最后在网上看到了qtmail,找人要了代码,在2.2下做移植,发现缺乏很多头文件和库,一个串一个,进行不下去了,很是郁闷,半个月时间过去了。
       突然看到QT4的版本中有qtmail源代码,于是开始移植qt4,本人所用的是MIPS Linux,网上能看到的移植步骤很少且不详细。中途遇到了很多问题,继续郁闷。同事说,qt4的开源版只有库,没有界面,如果这样,还要去写一个界面,时间就长了。
       尽管能够编译(同事完成),但运行时报错,如GLIBC2.3 not found 等,大致知道是库版本偏低,但去制作一个GLIBC版本高的Mipsel交叉编译器又得需要一段时间。
       先找一个能够直接使用的高版本交叉编译器吧,然后再根据错误提示,一步一步终于看到了界面。效果和文“
[color="#0000ff"]Fedora8上交叉编译qtopia4移植成功到s3c2410开发板
”基本一样。

       对于qtopia-opensource-src和qtopia-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()’:


2.gcc-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)



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

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

5.qtopia-opensource-src-4.2.0.tar.gz(包含Qt,Qtopia core)

四.Qtopia4移植过程
交叉编译器的安装略。
本人所用的交叉编译环境为mipsel-linux-gcc为3.4.3,mipsel-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
              = mipsel-unknown-linux-gnu-gcc
---
> QMAKE_CC              = mipsel-linux-gcc-3.4.3
16c16
          = -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为开发板的IP,10.2.2.76为PC机的IP,两者用交叉线互连。提前配置好TFTP服务,并指定好TFTP的根路径,将编译好的内核2.4或2.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即可。
总结:这几天潜心研究嵌入式,杂事一律暂停,发现效率相当的高,当然也连续熬了几天的夜。正确的方向+正确的方法+持之以恒一定能做成一件有价值的大事。
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/78300/showart_1866495.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP