全部博文(77)
分类: LINUX
2008-12-03 10:47:02
注意:此过程不适合qtopia-opensource-src-
# 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-
然后重命名解压后的包:
# mv qtopia-opensource-
# cd install
在此目录下,文件夹为qtopiacore的目录即是Qt,QtopiaCore所在目录,里边包含了开发所需的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)修改
# cd /usr/local/arm/
# vi arm-linux/include/linux/videodev2.h
在其中添加如下内容:
#define V
保存退出。
# vi arm-linux/sys_include/linux/videodev2.h
在其中添加如下内容:
#define V
保存退出。
否则会提示错误或警告信息,没有记录,已记不清。搜索发现,下面的文件用到了该变量。
[root@localhost applications]# grep -ri V
camera/v
camera/v
camera/formatconverter.cpp: case V
camera/formatconverter.cpp: case V
camera/formatconverter.cpp: case V
camera/formatconverter.cpp: case V
camera/formatconverter.cpp: case V
camera/formatconverter.cpp: case V
camera/formatconverter.cpp: case V
camera/formatconverter.cpp: case V
camera/formatconverter.cpp: case V
camera/formatconverter.cpp: case V
camera/formatconverter.cpp: case V
camera/formatconverter.cpp: case V
camera/formatconverter.cpp: case V
camera/formatconverter.cpp: case V
camera/formatconverter.cpp: case V
camera/formatconverter.cpp: case V
camera/formatconverter.cpp: case V
camera/formatconverter.cpp: case V
camera/formatconverter.cpp: case V
camera/formatconverter.cpp: case V
camera/formatconverter.cpp: case V
camera/formatconverter.cpp: case V
camera/videocapturedevice.cpp: format.fmt.pix.pixelformat = V
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。