QT+QTOPIA在linux上的移植 转

来源:互联网 发布:mac小游戏推荐 编辑:程序博客网 时间:2024/05/01 19:53

 

-- 目录 --
1. 简介
2. 准备工作
    2.1 目标
    2.2 软件包
    2.3 环境的建立
3. PC平台编译
    3.1 编译QT
    3.2 编译QTOPIA
    3.3 测试QTOPIA
4. 目标平台交叉编译
    4.1 交叉编译QT
    4.2 交叉编译QTOPIA
5. 移植QT中的相关设备接口
    5.1 鼠标
    5.2 触摸屏
6. 移植QTOPIA中的相关设备接口
    6.1 电源管理设备
7. 编写QT程序并移植
8. 编写QTOPIA程序并移植
X. tips


-- 正文 --

1. 简介
    QT是目前在linux上使用较广的一个图形系统。用户经常配合KDE桌面环境来使用。需要注意的是我们看到的并操作的是KDE,而不是QT。QT只是一套库函数(类库),KDE才是可执行程序.同时KDE为了其他程序方便的对其操作,也提供一套库函数(类库)。
    在PC机上的QT是基于X11图形系统的,在嵌入设备中往往不需要这么累赘,只需使用QTE(QT Embedded)即可包括PC平台中X11和QT库的功能。
    另一方面,嵌入设备受许多条件的限制,桌面系统也不能直接使用PC机上已有的系统。QTOPIA就是相当于KDE的桌面系统.根据具体嵌入设备的需要可以配置成phone和pocket pc两种。

2. 准备工作
2.1 目标
    首先要明确将要干的是什么,将怎么做。
    我们的目标很明确——就是在自己的开发板上使用基于QTE的桌面系统QTOPIA。
    我们的工作往往是先在PC完成以后移植到ARM平台上;先编译好QTE的库,再编译QTOPIA。因为这个系统和具体的设备有关(例如:触摸屏、时钟、电源管理设备等),所以最后还需要做设备接口的移植工作。
   
2.2 软件包
    系统平台:RedHat 9(完全安装)
    qt-embedded-2.3.7.tar.gz (qte的库)
    qt-x11-2.3.2.tar.gz (为了生成相应的qtdesigner和qvfb)
    qtopia-free-1.7.0.tar.gz (qte的桌面环境程序)
    tmake-1.11.tar.gz (编译时会用到)
    e2fsprogs-1.35.tar.gz (只使用其中的uuid的库)
    当下载完这些包以后我们先建立一个工作环境。假设所有软件包都下载在用户目录下,通常都是/root。

2.3 环境的建立
# cd ~        //进入目录
# mkdir x86-qtopia   //建立目录

# tar zxvf qt-x11-2.3.2.tar.gz      //解压
# mv qt-2.3.2 qt-x11                //改名

# cd x86-qtopia
# tar zxvf ../tmake-1.11.tar.gz
# tar zxvf ../qt-embedded-2.3.7.tar.gz
# tar zxvf ../qtopia-free-1.7.0.tar.gz
# tar zxvf ../e2fsprogs-1.35.tar.gz         //解压
# mv tmake-1.11 tmake                       //改名
# mv qt-2.3.7/ qt
# mv qtopia-free-1.7.0 qtopia
# mv e2fsprogs-1.35 e2fsprogs

# cp x86-qtopia arm-qtopia -rf


    记住,用户目录下的x86-qtopia目录是PC机上编译的工作环境,arm-qtopia是arm平台的交叉编译工作环境,qt-x11是两者公用的。

    接下来还必须编译qt-x11,主要是为了编译生成其中的qtdesigner和qvfb。qvfb程序在系统中并未安装,需要我们自己编译。 qtdesigner是和qt库的版本是相关的,当我们使用PC机上和QTE版本不符的qtdesigner时,可能在PC机上的qt-x11能使用的控件在QTE上并未实现,导致应用程序编译不成功。所以,我们使用2.3版本的QTE时,必须使用相同版本的qt-x11编译生成的qtdesigner和 qvfb。
# cd ~/qt-x11
# export QTDIR=$PWD
# echo yes | ./configure -static -no-xft -no-opengl -no-sm
# make -C src/moc
# cp src/moc/moc bin
# make -C src
# make -C tools/designer
# make -C tools/qvfb
# cp tools/qvfb/qvfb bin
# strip bin/uic bin/moc bin/designer bin/qvfb

# cd ..
# cp qt-x11/bin/* qt/bin -f
# cp qt-x11/bin/* qt/bin -f
 

3. PC平台编译
    编译之前做一下准备工作:打开一个控制台之后设置环境变量。
# cd ~/x86-qtopia
# export QTDIR=$PWD/qt
# export QPEDIR=$PWD/qtopia
# export TMAKEDIR=$PWD/tmake
# export TMAKEPATH=$TMAKEDIR/lib/qws/linux-generic-g++
# export PATH=$QTDIR/bin:$QPEDIR/bin:$TMAKEDIR/bin:$PATH

    3.1 编译QTE
# cd $QTDIR
# cp $QPEDIR/src/qt/qconfig-qpe.h src/tools/ -f
# (echo yes ; echo no) | ./configure -platform linux-generic-g++  -qconfig qpe -depths 16,24,32
# make -C src clean
# make -C src
    看一下$QTDIR目录下是否已经有了qt的库了?

    3.2 编译QTOPIA
# cd $QPEDIR/src
# ./configure
# make clean
# make

    3.3 测试QTOPIA
    激动的时刻来了,如果这个步骤成功将意味着可以做应用开发了。
# cd ~/x86-qtopia
# mkdir dist
# cd dist
# cp -af ../qt/lib/ .
# cp -af ../qtopia/apps .
# cp -af ../qtopia/bin .
# cp -af ../qtopia/plugins .
# cp -af ../qtopia/i18n .
# cp -af ../qtopia/pics .
    因为Security.png有点错误,所以必须进行一下操作:
# cd pics
# pngtopnm Security.png>a.pnm
# pnmtopng a.pnm>Security.png
    因为qpe运行的时候,当前目录必须是$QTDIR/bin,所以不能在$QTDIR目录下执行bin/qpe来运行。
# export QTDIR=~/x86-qtopia/qt
# cd $QTDIR/bin
# ./qvfb &
# ./qpe &
    看到qpe在qvfb中的界面了吗?我看到了~!


4. 目标平台交叉编译
    与PC机上的编译一样,打开一个控制台之后需要设置环境变量。
# cd ~/arm-qtopia
# export QTDIR=$PWD/qt
# export QPEDIR=$PWD/qtopia
# export TMAKEDIR=$PWD/tmake
# export TMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g++
# export PATH=$QTDIR/bin:$QPEDIR/bin:$TMAKEDIR/bin:$PATH
    4.1 交叉编译QT


    4.2 交叉编译QTOPIA


5. 移植QT中的相关设备接口
    5.1 鼠标

    5.2 触摸屏


6. 移植QTOPIA中的相关设备接口
    6.1 电源管理设备


7. 编写QT程序并移植


8. 编写QTOPIA程序并移植





X. tips
@ 移植的时候编译器的版本很重要.qte-2.3.7在redhat9的3.2编译器下工作很正常,但在Fedora4的gcc-3.4.2编译器下编译却不成功.根据测试,PC平台上使用gcc-3.2可以顺利编译,arm平台上使用gcc-2.95.2可以顺利通过(gnuarm的编译器好像不行,用华恒光盘中的armv4l-unkown-linux-gcc的可以编译通过)
@ 编译过程中会提示缺少uuid的头文件和库,下载e2fsprogs-libs-1.38.tar.gz,里面有uuid的相关代码.
@ 编译的时候需要指定编译器,在qt的configs目录下有许多文件,修改linux-arm-g++-*这些文件中的相关定义.例如:默认使用arm- linux-gcc编译器,而我使用的是GNUARM的arm-elf-gcc编译器,替换文件中所有arm-linux-前缀为arm-elf-即可.