Chinaunix首页 | 论坛 | 博客
  • 博客访问: 396100
  • 博文数量: 77
  • 博客积分: 3149
  • 博客等级: 中校
  • 技术积分: 828
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-25 11:48
文章存档

2012年(5)

2011年(2)

2010年(11)

2009年(44)

2008年(15)

我的朋友

分类: LINUX

2008-12-03 10:47:02

 

 

注意:此过程不适合qtopia-opensource-src-4.3.2.tar.gz,仔细察看会发现qtopia-opensource-src-4.3.2/src/libraries/qtopiabase/ 下根本没有custom-linux-cassiopeia-g++.h 文件,因此也不可能做如下操作。

# cp custom-linux-cassiopeia-g++.h custom-linux-arm-g++.h # cp custom-linux-cassiopeia-g++.cpp custom-linux-arm-g++.cpp

 

编译前约定:

 

安装目录为:/mnt/yaffs/install

目标目录为:/mnt/yaffs/target

 

下面解压软件包:

# tar zxvf qtopia-opensource-src-4.2.0.tar.gz

 

然后重命名解压后的包:

 

# mv qtopia-opensource-4.2.0 install

 

# cd install

 

在此目录下文件夹为qtopiacore的目录即是QtQtopiaCore所在目录里边包含了开发所需的Designer,qmake,uic,moc等工具也包含了面向嵌入式平台的Qt库。 为了让编译适应于目标平台和去除编译中将出现的错误,我们需要对源码进行修改和裁减。因此,编译的详细过程如下:

 

1 修改源码包

1

# cd src/libraries/qtopiabase/

# cp custom-linux-cassiopeia-g++.h custom-linux-arm-g++.h

# cp custom-linux-cassiopeia-g++.cpp custom-linux-arm-g++.cpp

 

2)修改3.4.1版的arm编译器的文件

# cd /usr/local/arm/3.4.1/

# vi arm-linux/include/linux/videodev2.h

在其中添加如下内容:

#define V4L2_PIX_FMT_SBGGR8  v4l2_fourcc('B','A','8','1')  /* 8  BGBG.. GRGR.. */

保存退出。

 

 

# vi arm-linux/sys_include/linux/videodev2.h

在其中添加如下内容

#define V4L2_PIX_FMT_SBGGR8  v4l2_fourcc('B','A','8','1')  /* 8  BGBG.. GRGR.. */

保存退出。

 

否则会提示错误或警告信息,没有记录,已记不清。搜索发现,下面的文件用到了该变量。

 

[root@localhost applications]# grep -ri V4L2_PIX_FMT  *

camera/v4l2videocapturedevice.cpp:        format.fmt.pix.pixelformat = V4L2_PIX_FMT_RGB32;

camera/v4l2videocapturedevice.cpp:            if (imageType != V4L2_PIX_FMT_RGB32)    // have been here? keep RGB32 if we can

camera/formatconverter.cpp:    case V4L2_PIX_FMT_RGB332:

camera/formatconverter.cpp:    case V4L2_PIX_FMT_RGB555:

camera/formatconverter.cpp:    case V4L2_PIX_FMT_RGB565:

camera/formatconverter.cpp:    case V4L2_PIX_FMT_RGB555X:

camera/formatconverter.cpp:    case V4L2_PIX_FMT_RGB565X:

camera/formatconverter.cpp:    case V4L2_PIX_FMT_RGB24:

camera/formatconverter.cpp:    case V4L2_PIX_FMT_RGB32:

camera/formatconverter.cpp:    case V4L2_PIX_FMT_GREY:

camera/formatconverter.cpp:    case V4L2_PIX_FMT_YVU410:

camera/formatconverter.cpp:    case V4L2_PIX_FMT_YVU420:

camera/formatconverter.cpp:    case V4L2_PIX_FMT_YUYV:

camera/formatconverter.cpp:    case V4L2_PIX_FMT_UYVY:

camera/formatconverter.cpp:    case V4L2_PIX_FMT_YUV422P:

camera/formatconverter.cpp:    case V4L2_PIX_FMT_YUV411P:

camera/formatconverter.cpp:    case V4L2_PIX_FMT_Y41P:

camera/formatconverter.cpp:    case V4L2_PIX_FMT_NV12:

camera/formatconverter.cpp:    case V4L2_PIX_FMT_NV21:

camera/formatconverter.cpp:    case V4L2_PIX_FMT_YUV410:

camera/formatconverter.cpp:    case V4L2_PIX_FMT_YUV420:

camera/formatconverter.cpp:    case V4L2_PIX_FMT_YYUV:

camera/formatconverter.cpp:    case V4L2_PIX_FMT_HI240:

camera/formatconverter.cpp:    case V4L2_PIX_FMT_SBGGR8:

camera/videocapturedevice.cpp:    format.fmt.pix.pixelformat = V4L2_PIX_FMT_RGB32;

 

 

3) 修改时区信息

#cd /mnt/yaffs/install

# vi src/libraries/qtopia/qtimezone.cpp

114行的 /usr/share/zoneinfo/ 改为/mnt/yaffs/target/zoneinfo/ ,保存退出。

# vi src/settings/systemtime/settime.cpp

318行的 /usr/share/zoneinfo/ 改为/mnt/yaffs/target/zoneinfo/ ,保存退出。

 

4) 裁减Qtopia core的库

 

# vi qtopiacore/qconfig-qpe.h

首先注释掉关于鼠标光标的宏定义,让程序运行时,触摸屏中央有光标出现:

// Qtopia Core

/*

#ifndef QT_NO_QWS_CURSOR

#  define QT_NO_QWS_CURSOR

#endif

*/

 

/*

#ifndef QT_NO_QWS_MOUSE

#  define QT_NO_QWS_MOUSE

#endif

#ifndef QT_NO_QWS_MOUSE_AUTO

#  define QT_NO_QWS_MOUSE_AUTO

#endif

*/

 

其它宏定义根据需要进行注释。

保存后将qconfig-qpe.h拷贝到global目录。

# cp  qtopiacore/qconfig-qpe.h   qtopiacore/qt/src/corelib/global/qconfig-qpe.h

 

5)注释掉其他文件里的QT_NO_QWS_CURSOR的定义

# vi qtopiacore/qt/src/corelib/global/qfeatures.h

 

注释掉如下内容:

/*

#if !defined(QT_NO_QWS_CURSOR) && (defined(QT_NO_CURSOR))

#define QT_NO_QWS_CURSOR

#endif

*/

保存退出。

 

# vi qtopiacore/qt/src/corelib/global/qglobal.h

注释掉以下内容:

//#    define QT_NO_QWS_CURSOR

 

 

 

首先,确定目录为: /mnt/yaffs/install,然后进行配置,执行如下命令

 

可以直接在源码目录下进行配置,但有时为了保持源码目录的干净不被破坏,单独建一个目录,如target,在target中进行配置。最后在运行make  install IMAGE=/qtopia4/方式生成最后下载到开发板的目录。

Qtopia has been configured. You can build Qtopia by running make.

 

After building, you MUST run make install, which will setup a runnable image in

/mnt/yaffs/install/image. You can override this by running make install

IMAGE=/other/location.

 

As configured, Qtopia MUST be run from /mnt/yaffs/install/image. If this is not

where you intend to run Qtopia from you should set the location by running

configure -prefix /opt/Qtopia.

但如果在与install平行的target目录进行编译,则写法如下:

#echo "yes" | ../install/configure -edition phone -xplatform linux-arm-g++ -arch arm -no-qvfb -release -displaysize 240x320 -no-modem -quicklaunch -defaultbuttons phone -image /mnt/yaffs/dest -prefix /mnt/yaffs/dest/ -no-bluetooth -no-drm -no-infrared -extra-qt-config "-qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libjpeg" -extra-qtopiacore-config ' -release -xplatform qws/linux-arm-g++ -embedded arm -qconfig qpe -depths 16,24 -qt-kbd-usb -no-kbd-tty -no-mouse-linuxtp'

 

 

主要配置选项解说如下:

-xplatform linux-arm-g++ -arch arm

目标平台为arm-linux,体系结构为arm

-no-qvfb 

目标平台已支持framebuffer,因而不使用虚拟帧缓冲。

-extra-qtopiacore-config

Qtopia core 配置选项。

-xplatform qws/linux-arm-g++ -embedded arm

目标平台编译配置文件使用qtopiacore/qt/mkspecs/qws/linux-arm-g++目录下的配置文件,嵌入式平台为arm

-qconfig qpe

使用配置文件qconfig-qpe.h,若使用qconfig-large.h配置文件,则使用-qconfig large选项。

 

-qt-sql-sqlite

数据库支持Sqlite

-qt-kbd-usb

键盘支持usb协议。

-no-mouse-linuxtp

触摸屏协议不支持linuxtp

 

3.编译源码包

执行如下命令:

#make

# make 2>/ERR.txt

后者是将错误信息写入到ERR.txt文件中

 

4.安装编译后源码包

# make install

编译安装完成后,在image=/mnt/yaffs/dest目录下产生各个目标文件。

也可以使用

Make install IMAGE=/重新指定路径

 

5.建立时区信息

# cd $QTOPIATARG

# mkdir zoneinfo

# cp -a /usr/share/zoneinfo/* $QTOPIATARG/zoneinfo/

 

3 移植成果演示

 

在这里,我们以Qtopia自带的例子程序为例,来演示应用程序运行步骤。首先在/mnt/nfs/dest/目录下用VI编辑器建立qtopiat.sh文件:

#!/bin/sh

export QTDIR=/mnt/yaffs/dest

export QPEDIR=/mnt/yaffs/dest

export KDEDIR=/mnt/yaffs/dest

export TSLIB_TSDEVICE=/dev/input/event0

export TSLIB_CONFFILE=/tmp/ts.conf

export TSLIB_CONSOLEDEVICE=none

export TSLIB_CALIBFILE=/tmp/ts-calib.conf

export TSLIB_PLUGINDIR=/mnt/yaffs/dest/lib

export QT_TSLIBDIR=/mnt/yaffs/dest/lib/

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/yaffs/dest/lib/

export QWS_SIZE=640x480

export QWS_MOUSE_PROTO="TPanel:/dev/input/event0 USB"

export LANG=zh_CN

insmod /mnt/yaffs/touchscreen/ts-uptech.o

cp /usr/qpe/etc/ts.conf /tmp

cd /usr/qpe/bin/

if [ "$1" = "c" ]; then

./ts_calibrate

fi

 

if [ -f "$TSLIB_CALIBFILE" ]; then

./qpe &>/dev/null

else

./ts_calibrate

./qpe &>/dev/null

fi

clear

保存退出修改用户使用权限

 

# chmod 777 qtopiat.sh

 

然后启动目标平台打开minicom终端,进入目标平台的系统。在主机上启动NFS服务,将主机的/mnt/nfs目录挂载到目标机的/mnt/nfs目录。

 

在终端里执行:

# cd /mnt/nfs/dest

# ./qtopiat.sh

 

编译过程中会出现各种各样的错误,请与宿主机操作系统环境以及GCC和交叉编译器的版本不同(含GLIBC库版本)而略有差异。下面给出笔者遇到的几个:

No1:

make[5]: Entering directory `/mnt/yaffs/target/src/libraries/qtopiaprinting'

uic /mnt/yaffs/install/src/libraries/qtopiaprinting/printdialogbase.ui

compiling /mnt/yaffs/install/src/libraries/qtopiaprinting/qprintdialogcreator.cpp

/mnt/yaffs/install/src/libraries/qtopiaprinting/qprintdialogcreator.cpp:23:32: ui_printdialogbase.h: No such file or directory

/mnt/yaffs/install/src/libraries/qtopiaprinting/qprintdialogcreator.cpp: In function `void createPrintDialog(QPrintDialog*)':

/mnt/yaffs/install/src/libraries/qtopiaprinting/qprintdialogcreator.cpp:33: error: `Ui' has not been declared

/mnt/yaffs/install/src/libraries/qtopiaprinting/qprintdialogcreator.cpp:33: error: `PrintDialogBase' undeclared (first use this function)

/mnt/yaffs/install/src/libraries/qtopiaprinting/qprintdialogcreator.cpp:33: error: (Each undeclared identifier is reported only once for each function it appears in.)

/mnt/yaffs/install/src/libraries/qtopiaprinting/qprintdialogcreator.cpp:33: error: `dialogBase' undeclared (first use this function)

/mnt/yaffs/install/src/libraries/qtopiaprinting/qprintdialogcreator.cpp:33: error: `Ui' has not been declared

/mnt/yaffs/install/src/libraries/qtopiaprinting/qprintdialogcreator.cpp:33: error: `PrintDialogBase' has not been declared

make[5]: *** [.obj/release-shared/qprintdialogcreator.o] Error 1

make[5]: Leaving directory `/mnt/yaffs/target/src/libraries/qtopiaprinting'

make[4]: *** [all] Error 2

make[4]: Leaving directory `/mnt/yaffs/target/src/libraries/qtopiaprinting'

make[3]: *** [sub-libraries-qtopiaprinting] Error 2

make[3]: Leaving directory `/mnt/yaffs/target/src'

make[2]: *** [all] Error 2

make[2]: Leaving directory `/mnt/yaffs/target/src'

make[1]: *** [qtopia_all] Error 2

make[1]: Leaving directory `/mnt/yaffs/target'

make: *** [all] Error 2

 

解决办法:将错误行注释掉

 

类似的错误还见到好几次,主要是#include包含头文件写在CPP文件的末尾,不知道是否允许,好像一般都写在最前面。笔者在redhat linux 9下报错,但在fedora core 5下又没有报错。

 

注:此文重点在前面编译部分,如果编译成功,后面就相对简单了。剩下的移植运行笔者暂没有去测试,因为笔者的工作环境是MIPS

阅读(2638) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~