详解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 <QApplication>
#include <QLabel>
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 <cstddef>
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 目录下的具体子路径。裁剪多个程序时,路径之间用空格符隔开;需要换行编辑时,则用 “ \ ”连接。
若添加应用程序,改用“ += ”即可,而用“ *= ”可以避免重复添加已存在的程序。
详解qtopia4.4.3移植到mips处理器以及相关问题总结相关推荐
- 2.4.U-Boot配置和编译过程详解-U-Boot和系统移植第4部分视频课程笔记
目录 2.uboot 主Makefile分析 2.1.Makefile 分析2 2.2.Makefile 分析3 2.3.Makefile 分析4 2.4.链接脚本的定义 2.5.指定链接地址 如果T ...
- NAudio用法详解(7)Wav文件结构分析及NAudio相关对象对应关系分析
目录 波形文件的基础知识 波形文件的存储过程 与声音有关的三个参数 1.采样频率 2.采样位数 3.声道数 WAV文件的编码 文件整体结构 RIFF区块 fmt区块(FORMAT区块) DATA区块 ...
- 转整型_SPI转can芯片CSM300详解、Linux驱动移植调试笔记
一口君最近移植了一款SPI转CAN的芯片CSM300A,在这里和大家做个分享. 一.CSM300概述 CSM300(A)系列是一款可以支持 SPI / UART 接口的CAN模块. 1. 简介 CSM ...
- 算法入门篇三 详解桶排序和整理排序知识 堆的相关操作 补充 不完整
归并排序不使用递归 使用一个变量,使其按照1.2.4.8递增,控制左右两边1个元素.2个元素.4个元素等元素的合并 完全二叉树 完全二叉树 要不全是满的,要不叶子节点出现在最后一层,只要出现了叶子节点 ...
- linux端口转发_详解Linux网桥功能--概念、工作机制、相关命令及实例说明
概述 在说Linux网桥之前,先介绍几个概念,有助于对网桥的功能及实现有更深的理解. 一个交换网络的逻辑图: 1. 冲突域 一个冲突域由所有能够看到同一个冲突或者被该冲突涉及到的设备组成.以太网使用C ...
- LVS负载均衡详解(一)lvs的定义、组成、相关术语+3种工作模式+10种调度算法
文章目录 lvs是什么 lvs的基本工作原理 lvs的组成 lvs的相关术语 lvs的三种工作模式 基于NAT的LVS模式负载均衡 nat模型的特性 基于DR的LVS负载均衡(直接路由模式) DR模式 ...
- mysql中的tee_详解mysql的tee功能 并利用其记录相关操作
由于经常对mysql数据库进行大量的更改操作,比如更改字段,添加或删除索引等等,我们把这些操作放到sql语句中,然后登陆mysql,通过source执行该sql文件,为了做好相关记录,方便以后的工作中 ...
- 主线剧情-番外02-设备树详解
设备树详解 本文 续接 <[主线剧情03]NXP i.MX 系列 u-boot 移植基础详解> 一文中移植过程小节中有关设备树的内容. 编辑整理 By Staok,如有错误恭谢指出,侵删. ...
- 极客日报第108期:华为余承东:卖车可以弥补手机失去的利润;龙芯详解 LoongArch 指令集
一分钟速览新闻点! 李想:理想汽车自研的自动驾驶系统明年完全可以和华为.特斯拉正面较量 百度 APP 更新 slogan:百度一下,生活更好 华为消费者业务 CEO 余承东:卖车可以弥补手机失去的利润 ...
最新文章
- SLAM闭合回环————视觉词典BOW小结
- 没办法,我必须干掉他们团队的 Leader
- webservice 测试窗体只能用于来自本地计算机的请求
- ASP.NET三层数据操作与GridView互动
- 1894. 找到需要补充粉笔的学生编号
- 外媒称青客公寓计划赴美IPO 筹资1.5亿美元
- 升级 python 2.6.6 到 2.7.14 版本(pip工具安装)
- 中国水蛭素产品行业市场供需与战略研究报告
- python爬知识星球付费数据_python抓取知识星球精选帖,制作为pdf文件
- 使用epublib自动生成epub文件
- 华为荣耀7i刷linux,华为荣耀7i卡刷教程_荣耀7i用第三方recovery刷机教程
- python爬取网易云评论 超简单教程
- Win7快速启动栏恢复方法
- P2123 皇后游戏
- Android 无法播放此视频
- 201671030109 韩艳艳 《英文文本统计分析》结对项目报告
- vue引入阿里妈妈的图标
- ruoyi-cloud 服务器端idea启动报错Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.6.0:exec (defau
- 【Java SE】设计模式
- Ubuntu Linux 锐捷 ruijie 认证成功 校园网 西电 老校区 新校区
热门文章
- java 进度管理系统,java毕业设计_springboot框架的软件项目开发过程进度管理
- Kinross信荣基金 小心“馅饼”变“陷阱”
- 有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?
- excel如何自动排列序号
- mtb7_参数控制要显示的维度Level of Detail Calculation_Context Filter > Fixed > Dimension > Include Exclude VizQ
- 如何让静态图片动起来?用这个gif动画制作工具就够了
- 单例模式实现雪花算法
- 破解明宇报表开发工具全程记录
- 小猿学python_小猿圈python学习之编程语言排名
- 泛型类及应用和泛型方法