Build Qtopia for arm

Build Qtopia for arm
一、相关工具以及软件包:
Ø           Cross-compiler Toolchains         提供arm交叉编译工具
Ø            e2fsprogs-1.35.tar.gz                    用于编译生成libuuid库
Ø            tmake-1.11.tar.gz                          生成makefile
Ø            tslib.tar.bz2                                    触摸屏库
Ø            qt-embedded-2.3.7.tar.gz               Qt/Embedded
Ø            qt-x11-2.3.2.tar.gz                          Qt/X11,提供uic,qvfb(不必)
Ø            qtopia-free-1.7.0.tar.gz                  Qtopia
将这些工具和软件包保存到/qte_arm/目录,并解压缩。注意Toolchains已保存到/opt/xscalev1/bin。

二、安装tmake:
       tmake用于交叉编译生成qt应用程序的makefile, 也可用于生成qt的本地makefile,区别在于设置TMAKEPATH路径的不同,一个用于arm,一个用于x86。
       注意:tmake机器上本来就有,但是需要1.11以上版本,可用tmake –v查看版本信息。
# cd /qte_arm
# tar xvfz tmake-1.11.tar.gz
# vi tmake-1.11/lib/qws/linux-arm-g++/tmake.conf
       TMAKE_LINK=arm-linux-g++     //将原来的arm-linux-gcc改成arm-linux-g++
       TMAKE_LINK_SHLIBS=arm-linux-g++      ( 不知道为什么要改,也不知道不改行不行 )

设置tmake环境变量:
# export PATH=/qte_arm/tmake-1.11/bin:$PATH
# export TMAKEDIR=/qte_arm/tmake-1.11
# export TMAKEPATH=/qte_arm/tmake-1.11/lib/qws/linux-arm-g++
另:由于qtopia编译过程很繁琐而且一般不能一次通过,所以也可将环境变量的设置写成脚本,脚本中也要写export。若脚本名为setenviroment,执行时应为:source setenviroment

三、安装e2fsprogs: 为arm编译libuuid库。
# cd e2fsprogs
# ./configure  –enable-elf-shlibs  –build=i386-linux  –host=arm-linux –with-cc=/opt/xscalev1/bin/arm-linux-gcc  –with-linker=/opt/xscalev1/bin/arm-linux-ld
# make
       其中lib目录下的libuuid.so.1.2、libuuid.so.1、libuuid.so即是我们要编译的库,必须检查是否出现以及相应格式,否则说明编译不成功。

四、编译触摸屏共享库tslib:
       Qt/Embedded只支持鼠标和键盘的操作,但在大部分嵌入式系统中利用触摸屏,所以用户必须对触摸屏的相关操作编译成共享库或静态库。
①、解压实验光盘提供的tslib.tar.bz2文件;
②、编译触摸屏库;
③、将触摸屏相关的头文件复制到qte-2.3.7/include文件夹中;
④、将编译好的触摸屏库文件复制qte-2.3.7/lib文件夹中;
[root@~qte_arm]#tar -jxf tslib.tar.bz2
[root@~qte_arm]#cd tslib
[root@~qte_arm]#export CC=arm-linux-gcc
[root@~qte_arm]#./autogen.sh
[root@~qte_arm]#./configure --host=arm-linux
[root@~qte_arm]#make
[root@~qte_arm]#cp -a src/.libs/*  /qte_arm/qte-2.3.7/lib/
[root@~qte_arm]#cp -a plugins/.libs/*.so  /qte_arm/qte-2.3.7/lib/
[root@~qte_arm]#cp -f src/*.h  /qte_arm/qte-2.3.7/include/

⑤、修改qte-2.3.7交叉编译环境参数文件使其增加对触摸屏的支持;
    用vi编辑/qte_arm/qte-2.3.7/configs/linux-arm-g++-shared文件,将SYSCONF_LIBS = -lm 修改为SYSCONF_LIBS = -lm -lts,然后保存修改后的文件。在编译qte-2.3.7源代码过程中使用触摸屏共享库。

五、安装Qt/Embedded:
       Qt/E已经解压到/qte_arm/qte-2.3.7,Qtopia解压到/qte_arm/qtopia-1.7.0。
     准备 :修改qte-2.3.7鼠标操作源代码src/kernel/qwsmouse_qws.cpp
       虽然qte-2.3.7支持鼠标操作,但是源代码src/kernel/qwsmouse_qws.cpp中读取鼠标数据函数readMouseData()读取的数据与开发板的触摸屏设备驱动输出的数据不匹配,所以用户必须修改读取鼠标数据函数readMouseData()。
# cp /emdoor/Emeddoorv1.3/Qt/patch/qt_patch/qt-2.3.7-arm/src/kernel/qwsmouse_qws.cpp 到相应目录下。
# cd /qte_arm/qte-2.3.7
# export QPEDIR=../qtopia-1.7.0
# export QTDIR=$PWD
# export PATH=$PWD/bin:$PATH
# export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH

# cp $QPEDIR/src/qt/qconfig-qpe.h  src/tools/
# ./configure –qconfig qpe –xplatform linux-arm-g++ -shared –no-xft
选择支持16depths色彩,不使用qvfb。实际上选择qvfb也无妨。
# make
如果编译成功,系统输出:
The Qt library is now built in ./lib
    The Qt examples are built in the directories in ./examples
    The Qt tutorials are built in the directories in ./tutorial
……
Enjoy!   - the Trolltech team

  编译生成的共享库libqte.so.2.3.7即是我们需要的qte库,保存在Qt目录的/lib文件夹中,通过查看/lib文件夹的文件可以确认编译是否成功。
#cd $QTDIR/lib
#ls
libqte.so libqte.so.2 libqte.so.2.3 libqte.so.2.3.7
利用file命令确认生成的共享库是否适合目标平台即ARM平台的二进制目标文件。
#file libqte.so.2.3.7
libqte.so.2.3.7:ELF 32-bit LSB shared object,ARM,version 1(ARM),not stripped
注意 :有人说要编辑src下的Makefile,add "-DQWS_CUSTOMTOUCHPANEL" into "QT_CXXFLAGS_OPT",然后make sub-src。暂时未明。

六、安装Qt/X11:
       编译qt-x11-2.3.2是为了得到uic和qvfb,uic在编译qtopia时要用到,因此要用gcc/g++编译,而不要用arm-linux-gcc/g++编译。Qvfb则用于在没有帧缓冲结构的x86处理器系统和X窗口环境下,模拟出虚拟的帧缓冲,以便用于在PC上进行qtopia应用开发时的仿真。
       实际上RedHat 9.0系统中已经装有QT,但是编译qtopia时不能使用比其自身更高版本的uic。
       # cd  /qte_arm/qt-2.3.2
       # export QTDIR=$PWD
       # export PATH=$PWD/bin:$PATH
       # export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH
       # ./configure –no-xft
       # make
       # make –C tools/qvfb 或者# cd tools/qvfb # make
       
       # cp tools/qvfb/qvfb  bin     //将上一步生成的可执行文件qvfb拷到bin目录下。
       //# cp bin/uic $QPEDIR/bin  //这一行不用。
       # cp bin/uic $QTEDIR/bin

七、Build Qtopia:
       # cp /qte_arm/e2fsprogs/lib/libuuid.so* /opt/xscalev1/lib
# cp /qte_arm/e2fsprogs/lib/libuuid.so* /opt/xscalev1/arm-linux/lib
       //这里将libuuid.so*拷到交叉编译工具的通用库中。实际上没有必要随便改动公用库,因为在建立x86下的Qtopia环境时也要用到相同名字的库,但是针对的处理器结构不同,用file命令可以查看。这是由于在编译e2fsprogs使用的配置参数不一样。
或者:
# export LD_LIBRARY_PATH=/qte_arm/qtopia-1.7.0/lib:$LD_LIBRARY_PATH
       # cp /qte_arm/e2fsprogs/lib/uuid/libuuid.a  /qte_arm/qtopia-1.7.0/lib
       //这样做时copy的必须是libuuid.a文件,然后在编译qtopia时会利用libuuid.a生成libuuid.so*,这样得到的libuuid.so*才是可用的。

       # cp –av /qte_arm/e2fsprogs/lib/uuid  /qte_arm/qtopia-1.7.0/include
       # export QTDIR=$QTEDIR
       # export PATH=$PWD/bin:$PATH
       # export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH
       # cd src
       # ../configure –xplatform linux-arm-g++
       # make
       //很奇怪,用./configure –help查看,发现只有-platform选项而没有-xplatform选项,不过这样做居然没有报错。也有人说要先转到src/目录下再进行configure,然后在此目录下make,没试过。

八、问题以及解决:
1.qwsmouse_qws.cpp在编译qte-2.3.7时出错:



       看error信息:
       kernel/qwsmouse_qws.cpp:1675:error:invalid use of undefined type ‘struct tsdev’
       /qte_arm/qte-2.3.7/include/tslib.h:20:error:forward declaration of ‘struct tsdev’
       可以知道出错发生在文件qwsmouse_qws.cpp和tslib.h,另外出错核心在于’struct tsdev’的使用,因此要查看相应文件的相应部分。发现qwsmouse_qws.cpp中include了tslib.h头文件,并且使用了变量’struct tsdev’,其中并没对它进行声明和定义。查看tslib.h,其中对’struct tsdev’进行了声明,但并没有定义,并且下面还使用了该变量。qwsmouse_qws.cpp中只包含了对’struct tsdev’声明的头文件,但没有包含任何对’struct tsdev’定义的文件。因此才出错,在qwsmouse_qws.cpp中报错为变量没定义,在tslib.h中报错为前向声明(大概就是在定义变量之前对变量进行声明和使用,这在使用一些指针变量、结构体时,由于在使用时没有定义,就不知道其所占存储空间大小)。
       因此,解决办法就是修改tslib.h文件,将对’struct tsdev’定义的头文件包含进来。经查看,在相同目录下的tslib-private.h文件中对’struct tsdev’进行了定义,因此可在tslib.h文件中加入“# include ”一行,这样就不会有forward declaration的错误,同时由于qwsmouse_qws.cpp包含了tslib.h,因而也就不会有变量没定义的错误。


2.tslib的链接问题:
       如果编译Qtopia时,tslib没有正确链接上,则会发生如下错误:

        Warning信息
       /qte_arm/qtopia-1.7.0/lib/libqtopia.so需要的libuuid.so.1找不到。说明链接路径有问题。将libuuid.so*拷到可链接的库目录下,或者拷到/qte_arm/qtopia-1.7.0/lib下,但是要把它加入LD_LIBRARY_PATH中。但奇怪的是这样并不能解决问题(有可能是之前环境变量设置脚本中没写export而导致实际上并没有将/qte_arm/qtopia-1.7.0/lib成功加入到LD_LIBRARY_PATH中去,可用env命令查看当前的环境变量进行检查)。是不是应该拷的是libuuid.a呢?的确如此,见前面(已经过实践)不过一种真正能解决问题的办法是Build Qtopia部分的开头阴影区两行。
        Error信息
       由于tslib(touch screen library)没有链接上。说是libqte.so中有undefined reference to ‘ts_close’等。说明在编译qte时生成的库文件libqte.so可能就没有链接上tslib。
       ①修改了qte-2.3.7/src下的Makefile(据说是tmake生成的?),将下面一行:
       ########## Compiler, tools and options 
LIBS = $(SUBLIBS) $(SYSCONF_QTLIBS) 
       后加上 –L ../lib –lts,即改为:LIBS = $(SUBLIBS) $(SYSCONF_QTLIBS) –L ../lib –lts
然后对qte重新编译,然后再编译qtopia即可。
       -L应该是指定链接目录,../lib即qtopia-1.7.0/lib,事先已经将tslib共享库文件copy到该目录下,-lts是指支持对tslib共享库的链接。大概如此,具体还要进一步学习Makefile的相关知识。不知道-L后不指定目录行不行?
       可参考:
http://www.qtcn.org/bbs/read.php?tid=3728
       ②第二次实践,突发奇想,在修改/qte_arm/qte-2.3.7/configs/linux-arm-g++-shared文件时,不但将# Linking applications下的SYSCONF_LIBS= -lm 修改为SYSCONF_LIBS = -lm -lts,还将# Linking shared libraries下的SYSCONF_LINK_SHLIB = arm-linux-gcc后加了-lts。这样就一次通过了,没有出现上述的tslib链接问题,也不用修改qte-2.3.7/src下的Makefile。
[参考资料]
①     《Porting Qtopia to Pxa272》,周绪宏,
http://zxuhong.blogchina.com/4631068.html

②     《实验十一 QT移植实验》,李外云,Emdoor PXA270 Linux实验文档
③ 《无人值守安全监控系统(家庭版)》,胡柏炅
④ 《Building Qtopia PDA OEM for arm》,
http://doc.trolltech.com/qtopia2.1/html/qtopia-build-oem-pda-arm.html

[声明]本站文章除特别注明外,均为作者原创,如需转载请注明作者与出处。
[提示]您可以通过这个链接引用这篇文章:
http://blog.chinaunix.net/u/23458/showart.php?id=164421
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值