详解qtopia4.4.3移植到mips处理器以及相关问题总结

最近公司做一个linux手机项目,需要做一个图形界面程序,移植qtopia,其中遇到一些难题也折腾了1个多星期,总算是弄好了,这里总结一下。分为以下几部分:

1 编译运行x86版本的qtopia

2 编译移植mips处理的qtopia

3 在qtopia4.4.3下编译运行helloworld程序

4 编译运行中遇到的问题和解决方法

5 qtopia的qconfigure选项详解

6 qtopia的裁剪


qtopia4的X86版和mips版我分别解压到不同目录分别更名命*-src和*-src-mips


一  编译运行X86版本的qtopia


首先现在自己笔记本上编一个X86版本的看一下效果。
(1)准备源码:
    qt-extended-opensource-src-4.4.3.tar.gz

tslib-1.4.1.tar.bz2


(2)开发环境:
  Ubuntu—linux-2.6.25

  mipsel-linux-gcc-4.3.0.tgz


(3) 先安装x86的qtopia手机版运行看看效果先:
   1.)解压源码qt-extended-opensource-src-4.4.3.tar.gz到qtopia4目录中
   2)创建目录build 和target
   [root@abilly qtopia4]# ls
   build             target
   qt-extended-4.4.3-src    
   3)设置环境变量
   export QPEDIR=/home/work/qtopia/build
   export QTOPIA_DEPOT_PATH =/home/work/qtopia/qt-extended-4.4.3-src                                                                      
   4)配置与编译,安装与运行
配置前可以到qt-extended-4.4.3下运行/configure –help看看选项说明
./configure --help
。。。。。。。
然后配置如下:进入build目录
../qt-extended-4.4.3-src/configure -build-qt -image /home/work/qtopia/target -prefix /home/work/qtopia/target


after long long time。。。。。

Qt Extended has been configured. You can build Qt Extended by running
bin/qbuild.
If you run bin/qbuild image, this will setup a runnable image in
/home/work/qtopia/target.
As configured, Qt Extended MUST be run from /home/abilly/qtopia4/target. If
this is not where you intend to run Qt Extended from you should set the
location by running configure -prefix /opt/Qtopia.
You have new mail in /var/spool/mail/root
配置成功
编译:
bin/qbuild
……
Qt Extended has been built.

You must now install Qt Extended by running 'bin/qbuild image'.
This will put the files required to run Qt Extended into the image:
/home/work/qtopia/target

Before you can use the SDK you must finalize it by running 'bin/qbuild sdk'.
This will put the required files into the SDK:
/home/work/qtopia/build/sdk
安装:
bin/qbuild image

。。。。

Qt Extended has been installed.


The files required to run Qt Extended are in the image:
/home/work/qtopia/target

Please note that Qt Extended cannot be moved. It must be run from the image.

编译开发包
 bin/qbuild sdk
(10多分钟即可)
Finalizing the SDK
/home/work/qtopia/qt-extended-4.4.3-src/src/build/bin/sdkcache /home/work/qtopia/build/sdk
WARNING: Your perl has a bug with output and UTF-8
WARNING: sdkcache will attempt to work around the bug by changing your
         LANG variable from zh_CN.UTF-8 to zh_CN.

The SDK has been finalized.
It can now be deployed to another computer.

Note that you should run configure before building again.

运行:

[root@abilly build]# bin/runqtopia




二 编译移植mips处理器的qtopia


编译了x86版本的qtopia看了一下效果,下面就要移植qtopia到开发板了,关键的其实就是用交叉编译器进行编译。


要说明的一点是交叉编译器的选择,这点非常重要。

首先是编译器的版本问题,我用4.3版本的编译器,编译过程中会出现一些诡异的链接库问题,怎么也解决不了,然后还用3.4.6的编译器就没有问题。但是运行不显示字体,最后解决这个问题还是用4.3版本的编译器,也采用了一些小手段,才算是终于移植成功,后面会说。

其次就是浮点的问题,可能用3.4.6版本的编译器都能编过去,但是我发现运行起来特别的慢,后来发现我们的处理器没有浮点协处理器编译器也没有用软浮点,因此内核只能用浮点处理模块(处理异常的方式)来处理浮点运算,效率非常低,用了软浮点的编译器,运算速度提升了一个数量级!对于浮点的问题我还写了一篇文章总结了一下。


1 解压原码包到目录qtopia_mips下,原码包的名字改为qt-extended-4.4.3-src-mips,在创建2个目录,build_mips target_mips。

2 修改环境变量,添加如下2个环境变量:

export QPEDIR=/home/work/qtopia_mips/build_mips
export QTOPIA_DEPOT_PATH=/home/work/qtopia_mips/qt-extended-4.4.3-src-mips  

3 编译tslib库,这个库是用来触摸屏校验和防抖的。

解压tslib.1.4.1.tar.gz到目录tslib下

进入原码目录,执行./autogen.sh  生成configure

执行./configure --host=mipsel-linux --prefix=/home/work/mips_tslib 生成Makefile。打开makefile看一下编译工具如CC AR是否变成了mipsel-linux-

执行make

执行make install 会在mips_tslib下生成4个目录 bin etc include lib。

4 进入build_mips下进行配置和安装,命令如下

../qt-extended-4.4.3-src-mips/configure -verbose -release -image /home/work/qtopia_mips/target_mips  -prefix /home/work/qtopia_mips/target_mips -no-pkg-config  -no-dbus -xplatform linux-mips-g++ -arch mips -displaysizes 480x272 -build-qt -qtopia-sqlite -v4l2 -remove-module modem  -remove-module bluetooth  -remove-module drm  -remove-module infrared -extra-qt-embedded-config "-xplatform qws/linux-mips-g++ -embedded mips -qconfig qpe -shared -little-endian -webkit -qt-kbd-usb -qt-libpng -qt-libjpeg -qt-gif -depths 4,8,16,32 -qt-mouse-tslib -I /home/work/mips_tslib/include -L /home/work/mips_tslib/lib"

after long long time。。。

Qt Extended has been configured. You can build Qt Extended by running
bin/qbuild.

If you run bin/qbuild image, this will setup a runnable image in
/home/work/qtopia_mips/target_mips.

As configured, Qt Extended MUST be run from
/home/work/qtopia_mips/target_mips. If this is not where you intend to run Qt
Extended from you should set the location by running configure -prefix
/opt/Qtopia.

然后执行编译 命令 bin/qbuild

执行安装 命令 bin/qbuild image

安装qtopia的软件开发工具包,执行命令 bin/qbuild sdk

这个编译安装的过程是非常漫长的,其中也会出现各种错误需要解决,这个会在最后汇总一下问题和解决方法。


5 将生成的qtopia程序移植到开发板的根文件系统上


我使用nfs根文件系统,因此在我的根文件系统中创建目录home/work/qtopia_mips/

这是因为在配置的时候使用了-prefix /home/work/qtopia_mips/target_mips目录必须一致

拷贝target_mips到这个目录下,target_mips下就是qtopia的整个软件程序的集合。


拷贝mips_tslib下的所有目录文件到根文件系统的usr/local下。


设置开发板的环境变量。vim /bin/qtopia

#! /bin/sh
export TSLIB_TSDEVICE=/dev/event0
export TSLIB_CONFFILE=/usr/local/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/local/lib/ts
export TSLIB_CALIBFILE=/etc/pointercal

export QPEDIR=/home/work/qtopia_mips/target_mips
export PATH=$QPEDIR/bin:$PATH
export LD_LIBRARY_PATH=$QPEDIR/lib:/usr/local/lib:$LD_LIBRARY_PATH
export  QWS_SIZE=480x272
export  HOME=/home/work/qtopia_mips
export  QWS_DISPLAY="LinuxFB:/dev/fb0"
export  QWS_DISPLAY="LinuxFB:mmWidth94:mmHeight70:0"
export  QWS_KEYBOARD=TTY:/dev/tty1
export  QWS_MOUSE_PROTO="TSLIB:/dev/event0"
export  QT_PLUGIN_PATH=$QPEDIR/plugins/
export  QT_QWS_FONTDIR=$QPEDIR/lib/fonts/
export QTOPIA_PHONE_VENDOR=no
export QTOPIA_PHONE_DEVICE=no

触摸屏设备文件这个要根据具体开发板上触摸屏驱动的设备文件来写。

TSLIB_CALIBFILE是用来保存触摸屏的校准信息的。

LinuxFB:mmWidth94:mmHeight70:0这个是指的触摸屏的物理长宽。

最后2个环境变量QTOPIA_PHONE_VENDOR QTOPIA_PHONE_DEVICE,因为开发板没有modem模块在开机后qtopia会先检测modem,会一直在please wait。。

加上这2个环境变量就会跳过这个检测。

修改/etc/init.d/rcS,自启动qtopia。添加如下命令:

source /bin/qtopia
echo "Starting Qtopia, please waiting..." > /dev/tty1
#if [  -f /etc/pointercal ]; then
#    $QPEDIR/bin/qpe -qws &
#else
    /usr/local/bin/ts_calibrate
    $QPEDIR/bin/qpe -qws &
#fi
这样启动开发板,加载内核,挂载根文件系统后就会自启动qtopia了!


三 在qtopia4.4.3下编译运行helloworld程序


qtopia4.4.3集成了qt4.4.3,在编译qtopia的过程中最后qbuild sdk就是安装了集成开发环境。

源码中的qtopiacore就是qt的源代码,也就是说安装qtopia的开发环境时也安装了qt的开发环境。

所以有2种方法来编译helloworld。

方法一:利用qbuild编译添加到qtopia的集成程序中

进入qt-extended-4.4.3-src-mips/src/applications/,这下面就是qtopia中集成的一些应用程序,

1 创建一个目录helloworld,进入目录,编写helloworld.cpp如下:


#include
#include

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLabel *label = new QLabel(”hello world !“);
    label->show();
    return app.exec();
}  


这就是一个简单的helloworld的c++程序。

2 设置环境变量 export PATH=路径/build_mips/sdk/bin:$PATH.

3 执行命令 qbuild -project 生成pro文件,如果需要将这个程序添加到qtopia的主界面上还需要修改一下pro文件,这个我没有细研究,我不是做应用的,使用开发板的客户可能会需要修改pro来添加应用程序到桌面。

4执行命令 qbuild image 编译helloworld并且将应用程序添加到target_mips/bin下。也就和其他应用程序放在一起。

方法二:利用QT提供的qmake单独编译

1 进入目录build_mips/qtopiacore/target下,这个目录就是qt提供的目标板的开发环境,qtopiacore/host则是主机的开发环境。可以在host下先编译主机版本运行一下看一下效果。

同样添加helloworld目录,编写helloworld程序

2 进入helloworld目录,修改环境变量。

export PATH=路径/build_mips/qtopiacore/target/bin:$PATH

3 qmake -project 生成pro文件

4 qmake 生成Makefile

5 make 编译程序,将生成的helloworld放到开发板上运行,不要忘记执行bin/qtopia设置开发板的环境变量

否则一些库找不到。


四 编译和运行中遇到的问题和解决办法


编译qtopia过程中错误解决:

1 错误:‘ptrdiff_t’不是一个类型名

解决:

添加#include

2 错误:‘QPhoneProfile::Schedule::Schedule’命名了一个构造函数而非类型

解决:

修改/usr/local/Trolltech/Qt-extended/qt-extended-4.4.3/src/libraries/qtopia下的qphoneprofile.cpp中:

QPhoneProfile::Schedule::Schedule&QPhoneProfile::Schedule::operator=(const Schedule &other)

为:

QPhoneProfile::Schedule&QPhoneProfile::Schedule::operator=(const Schedule &other)

3 错误: 致命错误:X11/extensions/XTest.h:没有那个文件或目录

解决:

sudoapt-get install xorg-dev

4 错误:致命错误:linux/videodev.h:没有那个文件或目录

解决:

因为现在的ubuntu12.04内核include目录中已经不包含videodev.h头文件

从工具链的头文件中copy一个到/usr/inlcude/linux目录下即可继续编译。


编译tslib过程中错误解决:

1 错误:错误:调用‘__open_missing_mode’,声明有错误属性

解决:

gcc-4.3对语法检查严格的结果,open传参数量不对,找到出错的那一句,修改一下。加入第三个参数mode 0777即可。

2错误:ts_test.c:(.text+0x3b4):undefined reference to `rpl_malloc'

解决:

打开config.h.in注释掉#undefmalloc


开发板启动qtopia遇到问题总结:

1在开发板上运行校正程序时出现Noraw modules loaded

解决方法:把 tslib/etc目录下的ts.conf"#module_rawinput"的注释符号“#”去掉。但记住不要在前面留有空格 ,否则会出现错误Segmentationfault

2Warning:Unable to open /usr/share/zoneinfo/zone.tab

解决方法:在目标机上建立目录mkdir–p/usr/share/zoneinfo

拷贝主机目录文件/home/work/qtopia_mips/qt-extended-4.4.3-src-mips/etc/zoneinfo/zone.tab到目标机/usr/share/zoneinfo下。

3 qtopia运行字体不显示,告警信息如下:

QPainter::begin: Paint device returned engine == 0, type: 3
QPainter::setFont: Painter not active
QPainter::setWorldTransform: Painter not active
QPainter::begin: Paint device returned engine == 0, type: 3

这个问题困扰了我1个多星期,看报警是qpainter没有起来,起初用没有浮点的编译器编译,但是由于处理器没有浮点因此运行很慢,换成有浮点的编译器,版本是3.4,但是运行不显示字体,报上面的告警。这样看来也不是源码的错误,是编译器的错误,这样跟踪源码也没看出什么异样的地方,只能再换编译器,换成4.3版本的,编译过程中有错误,编译工具link_test时提示交叉编译器的ld找不到libstdc++.so.6。一直修改也没有解决这个问题,最后实在没有办法,就用了一招,将用3.4编译的程序中拷贝出来link_test到4.3编译的程序中,在编译,就过了,这也算是2个版本结合了一下,互补了一下,总算是解决了上面的问题。


五 qtopia的configure选项详解

qtopia配置选项解释:

-xplatformlinux-mips-g++ -arch mips

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


-no-qvfb

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


-extra-qtopiacore-config

Qtopiacore配置选项。


-xplatformqws/linux-mips-g++ -embedded mips

目标平台编译配置文件使用qtopiacore/qt/mkspecs/qws/linux-mips-g++目录下的配置文件qmake.conf,嵌入式平台为mips。如果你的mips交叉编译器名称和qmake.conf中的不一致,需要修改。


-qconfig qpe

使用配置文件qconfig-qpe.h,若使用qconfig-large.h配置文件,则使用-qconfig large选项。

可以通过修改这个配置文件对qotpia的库进行裁剪。


-qt-sql-sqlite

数据库支持Sqlite


-qt-kbd-usb

键盘支持usb协议。


-no-mouse-linuxtp -qt-mouse-tslib

-I/home/lwork/mips_tslib/include  -L/home/work/mips_tslib/lib

触摸屏协议不支持linuxtp,支持tslib,并在后面添加上刚才编译的tslib的头文件和库。


六 qtopia4的裁剪


1 裁剪Qt Embedded库,配置Qtopia支持触摸屏

    源码qtopiacore目录下qconfig-qpe.h中定义了相关宏,用于裁剪Qtopia特性。在qconfig-qpe.h中添加宏定义:

    #ifndef  QT_QWS_IPAQ

    #  define QT_QWS_IPAQ

    #endif

    #ifndef  QT_QWS_IPAQ_RAW

    #  define QT_QWS_IPAQ_RAW

    #endif

    由于配置Qtopia时,默认在源码qtopiacore/qt/src/corelib/ global目录下搜索配置文件,因此要将qconfig-qpe.h拷贝到该目录下。用户可以自定义裁剪Qtopia,但要注意特性之间的倚赖关系。

2 修改时区信息

    Qtopia运行时默认要到/usr/share/zoneinfo目录下读取时区信息,源码src/libraries/qtopia目录下的qtimezone.cpp以及src/settings/systemtime目录下的settime.cpp中有相关源码。为了使用Qtopia 自带的时区信息,现将相应的路径修改为 /Qtopia/qtopia-4.2.1/etc/zoneinfo/。

3 裁剪Qtopia 应用程序

    用户可以定制Qtopia 的应用程序,通过修改源码src 目录下custom.pri,即可实现添加或裁剪应用程序。

    输入以下文本,实现裁剪应用程序:

    PROJECTS -= applications/addressbook games/fifteen

“-= ”表示要裁剪程序,后面是程序源码在src 目录下的具体子路径。裁剪多个程序时,路径之间用空格符隔开;需要换行编辑时,则用 “ \ ”连接。

    若添加应用程序,改用“ += ”即可,而用“ *= ”可以避免重复添加已存在的程序。

你可能感兴趣的:(QT)