分类:
2012-05-30 15:11:26
很多人对qtopia-opensource-src和qtopia-core-opensource-src之间的区别不清楚,我也一直没彻底搞清楚,直到现在,对 最新的qt-embedded-linux-opensource-src-
上个月用户提出车载PC 上需要收发电子邮件,于是到处寻找,含sourceforge寻找有无支持QT的 email收发程序。已经记不清是否有支持qt的email收发程序,最后在网上看到了qtmail,找人要了代码,在2.2下做移植,发现缺乏很多头文件和库,一个串一个,进行不下去了,很是郁闷,半个月时间过去了。
突然看到QT4的版本中有qtmail源代码,于是开始移植qt4,本人所用的是MIPS Linux,网上能看到的移植步骤很少且不详细。中途遇到了很多问题,继续郁闷。同事说,qt4的开源版只有库,没有界面,如果这样,还要去写一个界面,时间就长了。
尽管能够编译(同事完成),但运行时报错,如GLIBC2.3 not found 等,大致知道是库版本偏低,但去制作一个GLIBC版本高的Mipsel交叉编译器又得需要一段时间。
先找一个能够直接使用的高版本交叉编译器吧,然后再根据错误提示,一步一步终于看到了界面。效果和文“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机,
2.目标机:聚芯Erasoc
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
/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
/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-
[root@srv3 work2]# gcc -v
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.mipsel-unkown-gnu-linux-gcc.tar.bz2(交叉编译器)
4.tslib-1.3.tar.bz2(管理目标平台的触摸屏)(此版本中暂未考虑)
5.qtopia-opensource-src-
交叉编译器的安装略。
本人所用的交叉编译环境为mipsel-linux-gcc为
编译前约定:工作目录为
/work2
[root@srv3 work2]# mkdir target
[root@srv3 work2]# tar zxvf qtopia-opensource-src-
[root@srv3 work2]# mv qtopia-opensource-
[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
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
< QMAKE_CC = mipsel-unknown-linux-gnu-gcc
---
> QMAKE_CC = mipsel-linux-gcc-
< 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
PMON>boot tftp://
我的根文件系统在/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
值得注意的是,必须保证主机上启动了NFS服务,将主机的/nfs/redhat1目录挂载到目标机的/目录下。通过察看一下,如果看到下面的显示,说明是正常的。
[root@localhost /]# showmount -e localhost
Export list for localhost:
/nfs/redhat1
然后在开发板上运行./qt.sh即可。
总结:这几天潜心研究嵌入式,杂事一律暂停,发现效率相当的高,当然也连续熬了几天的夜。正确的方向+正确的方法+持之以恒一定能做成一件有价值的大事。