您的位置:首页 > 编程语言 > Qt开发

qt4.6.3移植到mini2440的过程

2012-11-06 13:27 369 查看
前一段时间做了一个QT4.6.3移植到mini2440,之前也转载过一篇文章,发现按着上面的来会遇到了不少的问题,现在把其中的一些记录下来,

以免以后在走弯路。

首先,参照mini2440的光盘上的《mini2440用户手册》操作

(一)做好编译器,软件包在 arm-linux-gcc-4.4.3。软件包为arm-linux-gcc-4.4.3.tar.gz

(二)。拷贝arm-qte-4.6.3-20100802.tar.gz,然后解压,进入arm-qte-4.6.3

(1)。mini2440为我们的QtE-4.6.3 的编译制作了现成的脚本 build-all,所以,直接./build-all

这个过程将十分漫长,根据机器配置不同,会有不同的编译时间。

期间,我遇到了一个问题:

./../corelib/tools/qbytearray.cpp:54:18: 致命错误: zlib.h:没有那个文件或目录

致命错误: zlib.h:没有那个文件或目录

这个错误是因为zlib包没有安装,安装后问题即可解决。但有一点请注意安装命令是:sudo apt-get install zlib1g-dev,而非sudo apt-get install zlib

(2).当顺利执行完毕,再运行 mktarget 脚本,

./mktarget

将会从编译好的目标文件目录中,提取出必

要的 QtE-4.6.3 库文件和可执行二进制示例,并打包为 target-qte-4.6.3.tgz。

(3).把上面这个包在开发板的根目录下解压,就可以使用了,如下命令

#tar xvzf target-qte-4.6.3.tgz –C /

这样,

就会在/usr/local/目录下创建生成 Trolltech 目录,

它里面包含了运行所需要的所有库文件和可执行程序。

同时,我在板子上的/usr/local/Trolltech/QtEmbedded-4.6.3-arm/下建立了bin目录(我的这个原来没有bin这个目录)

(二)。 安装触摸屏校验工具

(1) tslib-1.4.tar.gz放到一个目录下,比如/opt目录下。接着执行命令如下:

tar zxvf tslib-1.4.tar.gz 然后

(2) Source autogen.sh

然后

(3)./configure --prefix=/usr/local/tslib --host=arm-linuxac_cv_func_malloc_0_nonnull=yes

(4)在然后:make

我遇到了一个错误:

In file included from /usr/include/fcntl.h:252:0,

from /usr/include/sys/fcntl.h:1,

from ts_calibrate.c:20:

In function ‘open’,

inlined from ‘main’ at ts_calibrate.c:227:11:

/usr/include/bits/fcntl2.h:51:24: error: call to ‘__open_missing_mode’ declared with attribute error: open with O_CREAT in second argument needs 3 arguments

In function ‘open’,

inlined from ‘main’ at ts_calibrate.c:229:11:

/usr/include/bits/fcntl2.h:51:24: error: call to ‘__open_missing_mode’ declared with attribute error: open with O_CREAT in second argument needs 3 arguments

make[2]: *** [ts_calibrate.o] Error 1

make[2]: Leaving directory `/home/ouyang/Downloads/tslib/tests'

make[1]: *** [all-recursive] Error 1

make[1]: Leaving directory `/home/ouyang/Downloads/tslib'

make: *** [all] Error 2

这个由于编译器语法检查严格的原因,解决方法如下:

在源文件 ./tests/ts_calibrate.c 中

// 源文件

// if ((calfile = getenv("TSLIB_CALIBFILE")) != NULL) {

// cal_fd = open (calfile, O_CREAT | O_RDWR);

// } else {

// cal_fd = open ("/etc/pointercal", O_CREAT | O_RDWR);

// }

// 需要更改成如下形式

if ((calfile = getenv("TSLIB_CALIBFILE")) != NULL) {

cal_fd = open (calfile, O_CREAT | O_RDWR, 0777);

} else {

cal_fd = open ("/etc/pointercal", O_CREAT | O_RDWR, 0777);

}

保存后重新编译即可

(5)以上无错误后,make install

如果以上步骤没错,则可以在/usr/local/tslib下出现我们需要的库文件,这些库文件我们移植时会用到。

(四)。移植到mini2440上:

(1)在板子上建立以下目录:

/usr/local/tslib

把在pc机上编译安装好/usr/local/tslib/目录下的所有文件都复制到开发板/usr/local/tslib/下

(2)。用命令执行:vi /etc/profile,在里面增加如下内容:

export QTDIR=/usr/local/Trolltech/QtEmbedded-4.6.3-arm

export QPEDIR=/usr/local/Trolltech/QtEmbedded-4.6.3-arm

export TSLIB_ROOT=/usr/local/tslib

export PATH=$QTDIR/bin:$PATH

export TSLIB_CONSOLEDEVICE=none

export TSLIB_FBDEVICE=/dev/fb0

export TSLIB_TSDEVICE=/dev/input/event0

export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts

export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf

export TSLIB_CALIBFILE=/etc/pointercal

export QWS_MOUSE_PROTO=Tslib:/dev/input/event0

export QWS_DISPLAY=LinuxFb:/dev/fb0

export QWS_SIZE=240x320

export LD_LIBRARY_PATH=$TSLIB_ROOT/lib:$QTDIR/lib:/usr/local/lib:$LD_LIBRARY

(3)修改mini2440上/usr/local/tslib/etc/ts.conf 文件:把第二行# module_raw input 前面的#和空格去除,保存退出。

得到的配置文件如下:

module_raw input

module pthres pmin=1

module variance delta=30

module dejitter delta=100

module linear

然后,进行触摸屏的校正:

cd /usr/local/tslib/bin

./ts_calibrate(关于这一步,在mini2440的用户手册上有详细的说明)

(4)。首先在pc机上编译,进入程序(Q_C)目录,然后执行命令如下:(Q_C是我自己写的qt程序的目录)

/usr/local/Trolltech/QtEmbedded-4.6.3-arm/bin/qmake

(5)。执行完后,用命令:file Q_C 是否为二进制文件。如果是,则说明编译成功,可以移植到mini2440开发板了。

把编译好的程序Q_C通过复制到开发板/usr/local/Trolltech/QtEmbedded-4.6.3-arm/bin/目录下

然后通过终端执行./Q_C –qws –fonts wenquanyi,此时,我出现了如下的问题:

./Q_C: /lib/libc.so.6: version `GLIBC_2.9' not found (required by /usr/local/Trolltech/QtEmbedded-4.6.3-arm/lib/libQtGui.so.4)

因为,我把之前文件系统中的qte相关文件都删除了。添加了tslib所有文件及qt-everywhere-opensource-src-4.6.3编译安装后产生在/usr/local/Trolltech/QtEmbedded-4.6.3-arm中的lib文件夹copy到了开发板文件系统中。然后修改了/etc/profile及配置文件。

此问题出来lib文件夹下,是arm-linux-gcc编译器的库文件。由于我用比较高级的arm-linux-gcc版本编译qt。所有也要在lib下移植比较新的arm-linux-gcc版本lib。

解决如下

把lib文件夹内容更新。用新的编译工具的库代替。

此时,我的板子上的中文没法正常显示,于是:

(6)mini2440上显示字体时的环境变量设置:

首先,要保证板子的/usr/local/TR../Q../lib/fonts(这个路径根据自己的实际情况而定)下有font_wenquanyi文泉驿字体,没有的话从网上下一个

然后路径根据自己的实际情况:

我的路径是是/usr/local/TR../Q../lib/fonts,把该路径加入到/etc/profile

export QT_QWS_FONTDIR=/usr/local/TR../Q../lib/fonts

然后source /etc/profile

这下,OK了

不过,我又出了一个问题:

在这段代码里:

QString MainWindow::stringToUnicode(QString str)

12 {

13

14 // 这里传来的字符串一定要加tr,main函数里可以加 QTextCodec::setCodecForTr(QTextCodec::codecForLocale());

15

16 //str=tr("你好");

17 const QChar *q;

18 QChar qtmp;

19 QString str0, strout;

20 int num;

21 //int len=str.local8Bit().length();

22 q=str.unicode();

23 int len=str.count();//这里有问题

24

25 qDebug()<<"lenthe = ";

26 qDebug()<<len;

27 for(int i=0;i<len;i++)

28 { qtmp =(QChar)*q++;

29 num= qtmp.unicode();

30 qDebug()<<num;

31 if(num<255)

32 strout+="00"; //英文或数字前加"00"

33 str0=str0.setNum(num,16);//变成十六进制数

34 strout+=str0;

35

36 }

37

38 return strout;

39 }

这个函数是把qsting转为gsm模块能直接使用的能unicode码

调用这个函数,我传的参数是“工作愉快!”,如果是在pc机上, 执行int len=str.count();

我得到的值是5,如果在mini2440上,我得到的值13,然后,不知该怎么解决了。。。。。。

如果哪位大牛知道怎么解决,还望给小弟指点指点。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: