zoukankan      html  css  js  c++  java
  • QT移植详解

    原文:http://www.embedu.org/Column/Column415.htm

    作者:程老师,华清远见嵌入式学院讲师。

    在数据结构的栈和队列的学习过程中,除了需要了解栈、队列的基本特点外,需要掌握包括创建、出栈入栈、出队入队等基本操作。并熟悉一些常见的应用问题,比如球钟问题就是一个典型利用栈和队列实现的实际问题。本文描述球钟问题的具体实现过程。

    大家都知道,Qt程序时可以跨平台的,可以在任何平台运行。我们在pc机上编写Qt程序的时候可以很快就运行出来,但是如果要把它移植到另一个平台,我们该怎么做呢?下面开始我们的工作吧。

    平台:s3c2410
            交叉编译工具链:arm-none-linux-gnueabi-gcc(4.3.2)
            源码:tslib-1.4.tar.gz、qt-everywhere-opensource-src-4.7.0-beta2.zip

    一、移植tslib

    A、解压tslib源码包, 运行autogen.sh生成configure文件。如果出了如下错误:

            /autogen.sh: 4: autoreconf: not found

            因为没有安装一些工具, (ubuntu 10.04)用下面的命令安装好就可以了。
                    sudo apt-get install autoconf automake libtool autotools-dev

    B、 执行confugure生成Makefile文件

            $ echo "ac_cv_func_malloc_0_nonnull=yes" >$ARCH-linux.cache
                    $        ./configure        --host=arm-softfloat-linux-gnu        --prefix=/home/linux/tslib --cache-file=$ARCH-linux.cache

            说明:
                    --host是指你的交叉编译器的前最;例如:你的交叉编译器是arm-linux-gcc,则
                    --host=arm-linux.如果是arm-none-linux-gnueabi-gcc 则--host=arm-none-linux-gnueabi

            -prefix 是你执行make install 的时候编译后生成的可执行文件和库文件以及配置文所安装的目录,这个目录不能和tslib源码目录相同;

            configure文件下还有好多选项,你可以执行./configure --help 来进行选择其他项,不过在这里这些选项就够了。

    C、执行make、make install操作

    D、把指定安装目录下的tslib的文件都拷贝到你所挂载的根文件下
                    $ cp -a /home/linux/tslib /rootfs

    E、修改/rootfs/tslib下的etc目录中ts.cong文件
                    #vim ts.conf 将第二行的#module_raw input修改成module_raw input 注意一定要顶格写否则程序执行时会发生读取ts.conf错误

    F、启动开发板,设置一些环境变量

    在开发板的/etc/profile文件中添加如下代码
                    export TSLIB_ROOT=/tslib
                    export TSLIB_TSDEVICE=/dev/event0
                    export LD_LIBRARY_PATH=/tslib/lib:$LD_LIBRARY_PATH
                    export QWS_SIZE=320x240
                    export TSLIB_FBDEVICE=/dev/fb0
                    export TSLIB_PLUGINDIR=/tslib/lib/ts
                    export TSLIB_CONSOLEDEVICE=none
                    export TSLIB_CONFFILE=/tslib/etc/ts.conf
                    export POINTERCAL_FILE=/etc/pointercal
                    export QWS_MOUSE_PROTO=Tslib:/dev/event0
                    export TSLIB_CALIBFILE=/etc/pointercal
                    export QWS_DISPLAY="LinuxFb:mmWidth100:mmHeight130:0"
                    export TSLIB_TSEVENTTYYPE=H3600

    说明:
                    TSLIB_TSDEVICE        //触摸屏设备文件名。
                    TSLIB_CALIBFILE        //校准的数据文件,由ts_calibrate校准程序生成。
                    SLIB_CONFFILE        //配置文件名。
                    TSLIB_PLUGINDIR         //插件目录
                    TSLIB_CONSOLEDEVICE        //控制台设备文件名
                    TSLIB_FBDEVICE        //设备名

    以上环境变量在实际开发中的实际配置可以根据实际情况决定。而这些指定的设备节点一定要和你的开发板上的/dev目录下的设备节点相对应。

    G、 就可以运行/tslib/bin下的测试文件,如ts_calibrate校准程序。
            # /tslib/bin/ts_calibrate

    注意:

    1、我们在实际调试的时候,都是通过nfs挂载的形式。当我们运行ts_calibrate的时候,会在/etc目录下生成一个pointercal文件。有时候会因为挂载目录的权限不够,导致无法生成Pointercal文件。这个时候我们可以用chmod 777 etc加个权限。

    2、有时候由于交叉编译工具两没有指定正确,会出现非法指令或者是“ line 1: syntax error: unexpected "("”错误。可以用file ts_calibrate是否是在当前平台上运行的程序,用readelf -a ts_calibrate查看当前的指令集.

    3. export QWS_DISPLAY="LinuxFb:mmWidth100:mmHeight130:0",这句话我们在后面的Qt程序国际化的得到,在移植的所有工作都完成以后,我发现LCD屏山的字体非常小。后来经过多发打听,才知道需要修改这句话。我们把其中的数字值都改为其一半的时候,屏山的字体就比较大了。具体原因有待研究。

    二、qt-everywhere的移植

    1、 解压源码并改名
                   $ tar xvf qt-everywhere-opensource-src-4.7.0-beta2.zip 
                   $ mv qt-everywhere-opensource-src-4.7.0-beta2 qt-everywhere-source
                   $ mkdir qt-everywhere-target

    2、 配置
                   $ cd qt-everywhere-target
                   $ ../qt-everywhere-source/configure  -prefix  /qt-everywhere  -embedded  arm  -release  -opensource  -fast  -no-accessibility   -no-scripttools  -no-mmx  -no-multimedia  -no-svg  -no-webkit  -no-3dnow  -no-sse  -no-sse2  -silent  -qt-libpng  -qt-libjpeg -no-libtiff -no-multimedia -make libs -nomake tools -nomake examples -nomake docs -nomake demo -no-nis -no-cups -no-iconv -no-dbus -no-openssl -xplatform qws/linux-arm-gnueabi-g++ -little-endian -qt-freetype -depths 16,18 -qt-gfx-linuxfb -no-gfx-transformed -no-gfx-multiscreen -no-gfx-vnc -no-gfx-qvfb -qt-kbd-linuxinput -no-glib -qt-mouse-tslib -I/home/linux/tslib/include -L/home/linux/tslib/lib

    3、 编译
                    $ make

    4、 安装
                    $ make install

    5、 添加环境变量
                    修改/etc/bash.bashrc添加如下内容
                    export PATH=$PATH:/qt-everywhere/bin

    6、 修改文件系统
                    $ cp / qt-everywhere /source/rootfs -a

    7、 修改/source/rootfs/etc/profile添加如下内容
                    export LD_LIBRARY_PATH=/qt-everywhere/lib:$LD_LIBRARY_PATH
                    export QWS_SW_CURSOR
                    export QT_QWS_FONTDIR=/qt-everywhere/lib/fonts
                    export set HOME=/root
                    export set QPEDIR=/ qt-everywhere

    8、 修改/ qt-everywhere/bin/qmake
                    $ cd / qt-everywhere/bin
                    $ mv qmake qmke-target

    三、qt应用程序的移植

    1、 写一个简单的应用程序
            //main.cpp
            #include <QApplication>
            #include <QPushButton>

    int main(int argc, char **argv)
            {
                    QApplication app(argc, argv);

            QPushButton pushButton(QPushButton::tr("hello world"));
                    pushButton.show();

            return app.exec();
            }

    2、 主机上编译应用程序
                    $ qmake-target –project
                    $ qmake-target
                    修改Makefile
                    修改:
                     LIBS = $(SUBLIBS) -L/qt-everywhere/lib -lQtGui -L/home/linux/tslib/lib -L/qt-everywhere/lib -lQtNetwork -lQtCore –lpthread 
                    为:
                     LIBS = $(SUBLIBS) -L/qt-everywhere/lib -lQtGui -lts -L/home/linux/tslib/lib -L/qt-everywhere/lib -lQtNetwork -lQtCore –lpthread
                    $ make
                    $ cp test /source/rootfs

    3、 目标板上运行
                    $ ./test -qws
                    这时发现在LCD屏上出现一个button,这说明我们的Qt库已经移植成功
            4、 国际化

            国际化是在qt编程中比较重要一部分,这里我们尝试去国际化我们的应用程序
                    ●    修改main.cpp为

            #include <QApplication>
                    #include <QPushButton>
                    #include <QTranslator>

            int main(int argc, char **argv)
                    {
                            QApplication app(argc, argv);

                    app.setFont(QFont("simsun",10));

                    QTranslator translator;
                            translator.load("zh_CN",".");
                            app.installTranslator(&translator);

                    QPushButton pushButton(QPushButton::tr("hello world"));
                            pushButton.show();

                    return app.exec();
                    }

            ●    修改pro文件添加如下内容:

            TRANSLATIONS += zh_CN.ts

            ●    到处ts文件

            $ lupdate test.pro

            ●    查看ts文件

            zh_CN.ts
                    <?xml version="1.0" encoding="utf-8"?>
                    <!DOCTYPE TS>
                    <TS version="2.0">
                    <context>
                            <name>QPushButton</name>
                            <message>
                                    <location filename="main.cpp" line="15"/>
                                    <source>hello world</source>
                                    <translation type="unfinished"></translation>
                            </message>
                    </context>
                    </TS>
                    ●    修改ts文件为
                    <?xml version="1.0" encoding="utf-8"?>
                    <!DOCTYPE TS>
                    <TS version="2.0">
                    <context>
                            <name>QPushButton</name>
                            <message>
                                    <location filename="main.cpp" line="15"/>
                                    <source>hello world</source>
                                    <translation>你好</translation>
                            </message>
                    </context>
                    </TS>
                    ●    导出qm文件
                    $ lrelease zh_CN.ts –qm zh_CN.qm
                    ●    为文件系统中添加字库
                    $ cp simsun.ttc /source/rootfs/qt-everywhere/lib/fonts/
                    simsun.ttc是宋体字库,我们可以在Windows的C:WINDOWSFonts目录下找到
                    ●    运行程序
                    将hello 和 zh_CN.qm拷贝到/source/rootfs下
                    # ./hello –qws
                    会发现“hello world” 变成“你好”了!

    注意:

    -xplatform qws/linux-arm-gnueabi-g++ 平台,交叉编译工具链可以在这个地方改(qws)。

    对于翻译工作者,主要是利用Qt提供的工具lupdate、linguist和lrelease(它们都可以在Qt安装目录的bin文件夹下找到)来协助翻译工作并生成最后需要的.qm文件,包括以下内容:

    1.利用lupdate工具从源代码中扫描并提取需要翻译的字符串,生成.ts文件。类似编译时用到的qmake,运行lupdate时我们也需要指定一 个.pro的文件,这个.pro文件可以单独创建,也可以利用编译时用到的.pro文件,只需要定义好变量TRANSLATIONS就可以了,具体用法可 以参见后面的小例子。

    2.利用linguist工具来协助完成翻译工作,即打开前面用lupdate生成的.ts文件,对其中的字符串逐条进行翻译并保存。由于.ts文件采用了xml格式,我们也可以用其它编辑器来打开.ts文件并翻译。

    3.利用lrelease工具处理翻译好的.ts文件,生成格式更为紧凑的.qm文件。这便是翻译工作者最终需要提供给程序员的资源文件,它所占的空间比.ts文件小,但基本不具有可读性,只有QTranslator能正确的识别它。

  • 相关阅读:
    Oracle表空间管理
    Oracle创建函数
    Oracle触发器
    Oracle概要文件
    Oracle结构控制语句
    比较实用的网站
    Java23种设计模式之单例模式
    Java 对象属性的遍历
    JQuery 多个ID对象绑定一个click事件
    好习惯的养成****
  • 原文地址:https://www.cnblogs.com/ganrui/p/3712012.html
Copyright © 2011-2022 走看看