Linux 启动qt 非法指令,QT移植详解

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值