分享
 
 
 

Linux手机DIY.移植软件专题.Qt/Qte的编译环境

王朝system·作者佚名  2006-11-18
窄屏简体版  字體: |||超大  

Linux手机DIY.移植软件专题.Qt/Qte的编译环境

草木瓜 于 2006-11-15

一、序

一个偶然的想法,把在夏新E600出现Segmentation Fault的QT程序放在

MotoE680上运行,居然也出现了Segmentation Fault。我突然意识到问题可

能不是原先设想的那么复杂,我简单的看下QT的Makefile,又经一系列测试,

发现造成Segmentaion Fault的直接原因居然是编译参数。

二、重要提示

为了方便更好的理解本文,提供下面链结。

全系列的文章地址,手机应用开发专栏:http://blog.csdn.net/liwei_cmg

相关的重要成果的下载地址:http://play.younet.com/view.php?tid=24045

三、QTE程序的运行条件

大多数Linux手机都是基于QTE。运行QTE须要两个条件,一是lib文件,由

LD_LIBRARY_PATH指定,另一个就是fontdir了,而fontdir要QTDIR指定。也就是说

QTDIR/lib/fonts这个目录必须存在。可以看下面环境变量的实例:

Moto E680

#!/bin/bash

export QTDIR=/usr/lib/ezx

export LD_LIBRARY_PATH=$QTDIR/lib:`pwd`

export EZX_RES_FONT_PATH=$QTDIR/lib/fonts

exec ./$*

飞利浦 968 , 夏新 E600

#!/bin/sh

export CECHOME=/mnt/cellon

export QTDIR=$CECHOME/qt

export CECDIR=$CECHOME/cec

export LD_LIBRARY_PATH=/mnt/sd/e600/lib:$CECHOME/lib:$CECDIR/lib:$QTDIR/lib:LD_LIBRARY_PATH

exec ./$*

可见纯粹谈运行条件是很简单,QTE运行方式就不那么容易了。

四、QTE程序的运行方式

先举一些实际例子来分析:

A.在夏新E600运行飞利浦968的Qnes模拟器

#!/bin/sh

export CECHOME=/mnt/cellon

export QTDIR=$CECHOME/qt

export QWS_KEYBOARD=TTY

export CECDIR=$CECHOME/cec

export LD_LIBRARY_PATH=/mnt/sd/e600/lib:$CECHOME/lib:$CECDIR/lib:$QTDIR/lib:/mnt/doc/ibm/jvm/bin:$LD_LIBRARY_PATH

export QWS_DISPLAY=:1:/dev/fb0

/mnt/doc/cec_local/bin/qnesexe -qws 2>/mnt/sd/e600/log/qnesrunerror.txt

描述:模拟器与手机原有系统有按键和屏幕冲突。即发生键盘和屏幕事件时

两者都接受事件。游戏会花屏。

#!/bin/sh

export CECHOME=/mnt/cellon

export QTDIR=$CECHOME/qt

export CECDIR=$CECHOME/cec

export LD_LIBRARY_PATH=/mnt/sd/e600/lib:$CECHOME/lib:$CECDIR/lib:$QTDIR/lib:/mnt/doc/ibm/jvm/bin:$LD_LIBRARY_PATH

/mnt/doc/cec_local/bin/qnesexe 2>/mnt/sd/e600/log/qnesrunerror.txt

描述:模拟器运行一切正常。模拟器优先接受键盘和屏幕事件。

B.摩托罗拉E680运行普通的QTE程序

使用E680自带库编译:

arm-linux-g++ helloqt.cpp -o helloqtezx -fno-exceptions -fno-rtti -DQWS -Wall -g -I/home/gcc/src/dev-ezx-0.2.0/include/qt -I/home/gcc/src/dev-ezx-0.2.0/include/ezx -L/home/gcc/src/dev-ezx-0.2.0/lib -L/home/gcc/src/dev-ezx-0.2.0/lib/ezx/lib -lezxappbase-xscale-r -lqte-mt-xscale-r -lezxjpeg-xscale-r -lezxnotification-xscale-r

#!/bin/bash

export QTDIR=`pwd`

export LD_LIBRARY_PATH=$QTDIR:/usr/lib/ezx/lib

export EZX_RES_FONT_PATH=$QTDIR/fonts

exec ./helloqtezx

描述:QTE程序运行完全正常,可以拖动最大化最小化。

使用自编译的QTE(qt2.3.10)库进行编译(VFP):

arm-linux-g++ -c -I$QTDIR/include -pipe -DQWS -fno-exceptions -fno-rtti -O2 -Wall -W -DNO_DEBUG -o helloqt.o helloqt.cpp

arm-linux-g++ -L$QTDIR/lib -Wl,-rpath,$QTDIR/lib -o helloqtvfp helloqt.o -lqte -lm

#!/bin/bash

export QTDIR=`pwd`

export LD_LIBRARY_PATH=$QTDIR:/usr/lib/ezx/lib

export EZX_RES_FONT_PATH=$QTDIR/fonts

exec ./helloqtezx -qws

描述:稍微操作下菜单,QTE程序就不见了,更不用谈最大化最小化和拖动了。

[原因分析]

我们可以初步理解,基于Qte的手机系统有一个Qte Server,手机系统的每个程

序都是基于这个Qte Server,手机自带的lib文件则封装了基于Server的应用函数。

我们看A例子,如果声明了Qws相关的环境变量,系统要求必须通过独立的Qte Server

来运行Qnes,如果不加-qws参数,则提示:

QSocket::writeBlock: Socket is not open

QSocket::writeBlock: Socket is not open

QSocket::writeBlock: Socket is not open

QSocket::writeBlock: Socket is not open

No Qt/Embedded server appears to be running.

If you want to run helloqtvfp as a server,

add the "-qws" command-line option.

加上-qws后,以Server态运行,这样肯定于原因手机已有的Qte Server相冲突,

一旦发生按键屏幕事件,两个Server皆接受并处理,所以A例中的花屏也不难理解了。

再看B例,使用手机自带的lib文件,自然会让QTE程序运行于原先的Qte Server

上,自己编译的Qte库文件显然需要重新以Qte Server态启动,一点就没,是很正常

的。

所以写E680软件也好,写E600,968的Qte软件也好,最好能用本身的lib文件,

否则会与原有系统冲突,不能正常运行。

五、搭建编译环境

前面文章已经说过搭建交叉编译环境的要点,下面列出我实际使用的参数文件。

我使用的是cross-tools 0.42,做交叉编译环境没有比这个工具更省事的了。

主脚本 liwei.sh

#!/bin/sh

set -ex

TARBALLS_DIR=$TOOLCHAIN_DIR/crosstool-0.42/downloads

RESULT_TOP=$TOOLCHAIN_DIR

export TARBALLS_DIR RESULT_TOP

GCC_LANGUAGES="c,c++"

export GCC_LANGUAGES

mkdir -p $RESULT_TOP

eval `cat liwei.dat liweicmp.dat` sh all.sh --notest

echo Done.

编译参数配置 liwei.dat

KERNELCONFIG=`pwd`/arm.config

TARGET=arm-linux

TARGET_CFLAGS="-O"

GCC_EXTRA_CONFIG=" --with-float=soft --with-cpu=xscale --enable-cxx-flags=-mcpu=xscale"

GLIBC_EXTRA_CONFIG="--without-fp"

编译源文件配置 liweicmp.dat

BINUTILS_DIR=binutils-2.15

GCC_DIR=gcc-3.4.0

GLIBC_DIR=glibc-2.2.5

LINUX_DIR=linux-2.4.19

GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.2.5

gcc-3.4.0 Patch去除了一些冲突项,glibc,kernel等其余patch为cross-tool

默认自带

gcc-3.3.3h-ppc-asm-spec.patch

gcc-3.4.0-arm-softfloat.patch

gcc-3.4.0-pr14808-refix.patch

gcc-3.4.0-ultrasparc3-default64.patch

pr15647-fix.patch

pr13250-fix.patch

增加的gcc-3.4.0-arm-softfloat.patch可以去网上搜索,不过有不同的版本。

这里列出我的全部内容(比较夸张,复制建立个patch文件即可,注意要是Unix格

式):

diff -urNd gcc-3.4.0-orig/gcc/config/arm/coff.h gcc-3.4.0/gcc/config/arm/coff.h

--- gcc-3.4.0-orig/gcc/config/arm/coff.h 2004-02-24 15:25:22.000000000 +0100

+++ gcc-3.4.0/gcc/config/arm/coff.h 2004-05-01 19:07:06.059409600 +0200

@@ -31,11 +31,16 @@

#define TARGET_VERSION fputs (" (ARM/coff)", stderr)

#undef TARGET_DEFAULT

-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS)

+#define TARGET_DEFAULT + ( ARM_FLAG_SOFT_FLOAT + | ARM_FLAG_VFP + | ARM_FLAG_APCS_32 + | ARM_FLAG_APCS_FRAME + | ARM_FLAG_MMU_TRAPS )

#ifndef MULTILIB_DEFAULTS

#define MULTILIB_DEFAULTS - { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork" }

+ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork" }

#endif

/* This is COFF, but prefer stabs. */

diff -urNd gcc-3.4.0-orig/gcc/config/arm/elf.h gcc-3.4.0/gcc/config/arm/elf.h

--- gcc-3.4.0-orig/gcc/config/arm/elf.h 2004-02-24 15:25:22.000000000 +0100

+++ gcc-3.4.0/gcc/config/arm/elf.h 2004-05-01 19:12:16.976486400 +0200

@@ -46,7 +46,9 @@

#ifndef SUBTARGET_ASM_FLOAT_SPEC

#define SUBTARGET_ASM_FLOAT_SPEC "-%{mapcs-float:-mfloat} %{msoft-float:-mfpu=softfpa}"

+%{mapcs-float:-mfloat} +%{mhard-float:-mfpu=fpa} +%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}"

#endif

#ifndef ASM_SPEC

@@ -106,12 +108,17 @@

#endif

#ifndef TARGET_DEFAULT

-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS)

+#define TARGET_DEFAULT + ( ARM_FLAG_SOFT_FLOAT + | ARM_FLAG_VFP + | ARM_FLAG_APCS_32 + | ARM_FLAG_APCS_FRAME + | ARM_FLAG_MMU_TRAPS )

#endif

#ifndef MULTILIB_DEFAULTS

#define MULTILIB_DEFAULTS - { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" }

+ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" }

#endif

#define TARGET_ASM_FILE_START_APP_OFF true

diff -urNd gcc-3.4.0-orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h

--- gcc-3.4.0-orig/gcc/config/arm/linux-elf.h 2004-01-31 07:18:11.000000000 +0100

+++ gcc-3.4.0/gcc/config/arm/linux-elf.h 2004-05-01 19:19:06.935979200 +0200

@@ -30,9 +30,27 @@

/* Do not assume anything about header files. */

#define NO_IMPLICIT_EXTERN_C

-/* Default is to use APCS-32 mode. */

+/*

+ * Default is to use APCS-32 mode with soft-vfp.

+ * The old Linux default for floats can be achieved with -mhard-float

+ * or with the configure --with-float=hard option.

+ * If -msoft-float or --with-float=soft is used then software float

+ * support will be used just like the default but with the legacy

+ * big endian word ordering for double float representation instead.

+ */

+

#undef TARGET_DEFAULT

-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS)

+#define TARGET_DEFAULT + ( ARM_FLAG_APCS_32 + | ARM_FLAG_SOFT_FLOAT + | ARM_FLAG_VFP + | ARM_FLAG_MMU_TRAPS )

+

+#undef SUBTARGET_EXTRA_ASM_SPEC

+#define SUBTARGET_EXTRA_ASM_SPEC "+%{!mcpu=*:-mcpu=xscale} +%{mhard-float:-mfpu=fpa} +%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}"

#define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6

@@ -40,7 +58,7 @@

#undef MULTILIB_DEFAULTS

#define MULTILIB_DEFAULTS - { "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" }

+ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork" }

#define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__"

@@ -55,7 +73,7 @@

%{shared:-lc} %{!shared:%{profile:-lc_p}%{!profile:-lc}}"

-#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc"

+#define LIBGCC_SPEC "-lgcc"

/* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add

the GNU/Linux magical crtbegin.o file (see crtstuff.c) which

diff -urNd gcc-3.4.0-orig/gcc/config/arm/t-linux gcc-3.4.0/gcc/config/arm/t-linux

--- gcc-3.4.0-orig/gcc/config/arm/t-linux 2003-09-20 23:09:07.000000000 +0200

+++ gcc-3.4.0/gcc/config/arm/t-linux 2004-05-01 20:31:59.102846400 +0200

@@ -4,7 +4,10 @@

LIBGCC2_DEBUG_CFLAGS = -g0

LIB1ASMSRC = arm/lib1funcs.asm

-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx

+LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx + _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi + _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 + _fixsfsi _fixunssfsi

# MULTILIB_OPTIONS = mhard-float/msoft-float

# MULTILIB_DIRNAMES = hard-float soft-float

diff -urNd gcc-3.4.0-orig/gcc/config/arm/unknown-elf.h gcc-3.4.0/gcc/config/arm/unknown-elf.h

--- gcc-3.4.0-orig/gcc/config/arm/unknown-elf.h 2004-02-24 15:25:22.000000000 +0100

+++ gcc-3.4.0/gcc/config/arm/unknown-elf.h 2004-05-01 19:09:09.016212800 +0200

@@ -30,7 +30,12 @@

/* Default to using APCS-32 and software floating point. */

#ifndef TARGET_DEFAULT

-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS)

+#define TARGET_DEFAULT + ( ARM_FLAG_SOFT_FLOAT + | ARM_FLAG_VFP + | ARM_FLAG_APCS_32 + | ARM_FLAG_APCS_FRAME + | ARM_FLAG_MMU_TRAPS )

#endif

/* Now we define the strings used to build the spec file. */

diff -urNd gcc-3.4.0-orig/gcc/config/arm/xscale-elf.h gcc-3.4.0/gcc/config/arm/xscale-elf.h

--- gcc-3.4.0-orig/gcc/config/arm/xscale-elf.h 2003-07-02 01:26:43.000000000 +0200

+++ gcc-3.4.0/gcc/config/arm/xscale-elf.h 2004-05-01 20:15:36.620105600 +0200

@@ -49,11 +49,12 @@

endian, regardless of the endian-ness of the memory

system. */

-#define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} - %{mhard-float:-mfpu=fpa} - %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}"

+#define SUBTARGET_EXTRA_ASM_SPEC "+%{!mcpu=*:-mcpu=xscale} +%{mhard-float:-mfpu=fpa} +%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}"

#ifndef MULTILIB_DEFAULTS

#define MULTILIB_DEFAULTS - { "mlittle-endian", "mno-thumb-interwork", "marm", "msoft-float" }

+ { "mlittle-endian", "mno-thumb-interwork", "marm" }

#endif

六、如何测试简单的QT程序

下面是一个十分简单的QT程序,也是来自Qte的教程。

helloqt.cpp

#include <qapplication.h>

#include <qpushbutton.h>

int main( int argc, char **argv )

{

QApplication a( argc, argv );

QPushButton hello( "Hello world!", 0 );

hello.resize( 100, 30 );

a.setMainWidget( &hello );

hello.show();

return a.exec();

}

下载qte-2.3.10(其他版本没有试),我们需要他的头文件,解压缩。我的

路径是/home/gcc/toolchain/qt-2.3.10,将E600或968自带libqte-mt.so.2.3.8

复制到/home/gcc/toolchain/qt-2.3.10/lib下,并做一些软连接或者干脆直接

复制(如libqte.so,libqte-mt.so ...),将自带的libjpeg.so.62.0.0复制到交

叉编译lib下,这时也需要做下类似的操作,我这里路径是/home/gcc/toolchain/gcc-3.4.0-glibc-2.2.5/arm-linux/arm-linux/lib

设置环境变量:

export TOOLCHAIN_DIR=/home/gcc/toolchain

export PATH=/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:$TOOLCHAIN_DIR/gcc-3.4.0-glibc-2.2.5/arm-linux/bin

export QTDIR=$TOOLCHAIN_DIR/qt-2.3.10

使用以下命令编译:

arm-linux-g++ -c -I$QTDIR/include -pipe -DQWS -fno-exceptions -fno-rtti -O2 -Wall -W -DNO_DEBUG -o helloqt.o helloqt.cpp

arm-linux-g++ -L$QTDIR/lib -Wl,-rpath,$QTDIR/lib -o helloqtfpa helloqt.o -lqte -lm

这个helloqtfpa就可以在E600,968上运行了,我当时用的E600的libqte-mt.so.2.3.8

编译后放在968上也能正常运行,我个人认为E600,968这两个文件差异是在于

对键盘的处理。

另外前一阵子令人郁闷的Segmentation Fault问题是由于,我使用了以下

语句进行编译:

arm-linux-g++ -L$QTDIR/lib -I$QTDIR/include -Wl,-rpath,$QTDIR/lib -o helloqterr helloqt.cpp -lqte -lm

最重要参数是-DQWS,没有它编译后-qws运行肯定出现Segmentation Fault。

至于为何如此,我没有做过Qte开发,还是不了解。

七、总结

至此,从解决安装包,到打开Shell入口,到解除软件安装限制,再到图形化

软件移植,夏新E600和飞利浦968终于取得实质性的成果。

本文即将结束时,又听到了subtle关于telnet的重大突破,令人兴奋不已!

感兴趣的朋友可以参考E680编译Qte的方法,用E600环境编译下整个Qte,思路

是完全一样的,此外qtopia,opie等等系列软件都需要众人去挖掘。

高兴之余,也有遗憾,一个是浮点问题没有得到彻底解决,二是E600,968上层

图形化源码没有,三是E600,968自带Qte库文件内容太少。这几个问题的确是进行

实际应用软件移植的烂路虎。

此外具体到实际软件,问题就越来越专业,以播放器为例,肯写要解决浮点问

题而且还是研究系统本身的音频设备,可能还需要用反汇编来做。一个软件成果

不是轻易能得到的,任重而道远。

话又说回来,如果你能实实际际一路跟着走过来,你获得的比一万个播放器可

要多得多!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有