原文: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能正确的识别它。