Chinaunix首页 | 论坛 | 博客
  • 博客访问: 200647
  • 博文数量: 50
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 583
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-12 14:38
文章分类

全部博文(50)

文章存档

2013年(50)

我的朋友

分类: LINUX

2013-04-22 08:03:30

QT移植详解


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

大家都知道,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
        #include

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
                #include
                #include

        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
                
                
                
                
                        QPushButton
                        
                                
                                hello world
                                
                        

                

                

                ●    修改ts文件为
                
                
                
                
                        QPushButton
                        
                                
                                hello world
                                你好
                        

                

                

                ●    导出qm文件
                $ lrelease zh_CN.ts –qm zh_CN.qm
                ●    为文件系统中添加字库
                $ cp simsun.ttc /source/rootfs/qt-everywhere/lib/fonts/
                simsun.ttc是宋体字库,我们可以在Windows的C:\WINDOWS\Fonts目录下找到
                ●    运行程序
                将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能正确的识别它。
阅读(1511) | 评论(0) | 转发(0) |
0

上一篇:Qt4.8.3移植总结

下一篇:qt移植解惑

给主人留下些什么吧!~~