分类: 嵌入式
2009-11-29 12:17:48
之前完成了ARM9平台上qt-embedded-4.5.1的移植,由于设计需要一个桌面环境,qte4的程序只能跑
在qtopia4的桌面环境下,于是开始尝试移植qtopia4到板子上去。
开发过程主要参考博客http://blog.csdn.net/hongjiujing/archive/2007/08/09/1733126.aspx,
感谢原作者!
以下介绍我的编译过程:
开发平台:redhat9 操作系统
开发板:(三星芯片S3C2410,ARM9)
交叉编译器:arm-linux-gcc-3.4.1
主机编译器:gcc-3.4.4(需要3.3以上版本)
软件资源包:(顺便给出可以下载的地址)
1.Red Hat Linux 9.0(主机操作系统)
2.gcc-3.4.4.tar.bz2(主机编译器)
3.arm-linux-gcc-3.4.1.tar.bz2(交叉编译器) (特别注意:编译Rootfilesystem 、busybox、APP(QT)要使用同一版本因为这些程序都要使用动态链接库即/lib下的SO,不同版的交叉编译器编译的程序使用不同的加载器即ld.so.x)
4.tslib-1.3.tar.bz2(管理目标平台的触摸屏)
5.qtopia-opensource-src-4.2.1.tar.gz(包含Qt,Qtopia core)
编译前的约定:
1)我的工作目录为:/mnt/nfs。
2)qtopia-opensource-src-4.2.1.tar.gz 软件包放在/mnt/nfs/qtopia4目录下。
一.编译主机编译器 gcc-3.4.4.tar.bz2
步骤如下:
# tar –jxvf gcc-3.4.4.tar.bz2
# ./configure (默认安装目录为:/usr/local)
# make
# make install
安装完成后,可执行文件放在/usr/local/bin目录下,库文件放在/usr/local/lib目录下。
二.安装交叉编译器 arm-linux-gcc-3.4.1.tar.bz2
步骤如下:
# tar jxvf arm-linux-gcc-3.4.1.tar.bz2
解压后的文件为 usr目录,其已包括可执行文件,直接将usr拷贝到根目录下。然后
# vi ~/.bashrc
在里边添加:
export PATH=$PATH:/usr/local/arm/3.4.1/bin
保存退出,执行:
# source /etc/profile
三.编译tslib-1.3.tar.bz2
详细步骤如下:
# tar jxvf tslib-1.3.tar.bz2
解压后的目录为tslib-1.3。
# cd tslib-1.3
# export CC=arm-linux-gcc
# export CXX= arm-linux-g++
# ./autogen.sh
# ./configure --prefix=/mnt/nfs/tslib1.3-install --host=arm-linux
( 配置目标平台为ARM-linux,在主机上的安装目录为/mnt/nfs/tslib1.3-install )
# make
# make install
四.编译 qtopia-opensource-src-4.2.1.tar.gz
编译前约定:
安装目录为:/mnt/nfs/qtopia4/qtopiatslibinstall
目标目录为:/mnt/nfs/qtopia4/qtopiatslibtarget
下面解压软件包:
# tar zxvf qtopia-opensource-src-4.2.1.tar.gz
然后重命名解压后的包:
# mv qtopia-opensource-4.2.1 qtopiatslibinstall
# cd qtopiatslibinstall
在此目录下,文件夹为qtopiacore的目录即是Qt,QtopiaCore所在目录,里边包含了开发所需的Designer,qmake,uic,moc等工具,也包含了面向嵌入式平台的Qt库。
编译前,首先建立定位到安装目录和目标目录的环境变量:
# export QTOPIAINST=/mnt/nfs/qtopia4/qtopiatslibinstall
# export QTOPIATARG=/mnt/nfs/qtopia4/qtopiatslibtarget
为了让编译适应于目标平台和去除编译中将出现的错误,我们需要对源码进行修改和裁减。因此,编译的详细过程如下:
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/3.4.1/arm-linux/sys_include/linux/videodev2.h
在其中添加如下内容:
#define V4L2_PIX_FMT_SBGGR8 v4l2_fourcc('B','A','8','1')
/* 8 BGBG.. GRGR.. */
保存退出。
3) 修改时区信息
# vi src/libraries/qtopia/qtimezone.cpp
将114行的 /usr/share/zoneinfo/ 改为/mnt/nfs/qtopia4/qtopiatslibtarget/zoneinfo/ ,保存退出。
# vi src/settings/systemtime/settime.cpp
将318行的 /usr/share/zoneinfo/ 改为/mnt/nfs/qtopia4/qtopiatslibtarget/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
2.配置源码包
首先,确定目录为: /mnt/nfs/qtopia4/qtopiatslibinstall
然后进行配置,执行如下命令 :
# ./configure -silent -release
-image /mnt/nfs/qtopia4/qtopiatslibtarget
-prefix /mnt/nfs/qtopia4/qtopiatslibtarget
-xplatform linux-arm-g++ -arch arm -no-qvfb
-displaysize 320x240 -no-modem
-extra-qtopiacore-config "-release -xplatform qws/linux-arm-g++ -embedded arm -opengl -qconfig qpe -qt-sql-sqlite
-depths 4,8,16,32 -qt-kbd-usb -no-kbd-tty -no-mouse-linuxtp
-qt-mouse-tslib -I/mnt/nfs/tslib1.3-install/include -L/mnt/nfs/tslib1.3-install/lib" 2>../qtopiaconfgureERR.txt
主要配置选项解说如下:
-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 -qt-mouse-tslib
-I/mnt/nfs/tslib1.3-install/include -L/mnt/nfs/tslib1.3-install/lib
触摸屏协议不支持linuxtp,支持tslib,并在后面添加上刚才编译的tslib的头文件和库。
2>../qtopiaconfgureERR.txt
最后将配置过程中的错误输出到qtopiaconfgureERR.txt文件中。
就在执行配置命令后,问题出现了,具体如下:
Checking the compiler (host): FAIL (can not run binaries)
通过字面的分析就是主机编译器检查未通过,可是我明明刚刚装好了gcc-3.4.4编译器的啊,
gcc -v 显示是 3.4.4的版本没错啊。
到底是怎么回事儿呢?于是上百度搜索,发现也有人遇到同样的问题了,可是没人给出解决方法,我
只有硬着头皮自己解决了。尝试了很多方法,怀疑是编译器的问题,换了好几个版本的编译器试了过
后还是出现同样的错误,一度抓狂。
上网搜gcc编译的方法,看到有一点说,编译后要进行一些设置,其中包括库路径的设置。
http://cdzhch84.blog.163.com/blog/static/3820050200710272352826/
于是export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH,再此执行configure...的时候,之前的问
题不再出现了!!!
当然为了不用每次都设置库路径,可以将export LD_LIBRARY_PATH=/usr/local/lib:$PATH写入~/.bashrc文件。
其实之前写个hello.cpp文件试试就知道,可以编译,但是执行的时候会提示库找不到。
3
至此,编译完成,下面就是要将之移植到板子上去,希望不会出奇怪的问题!