分类:
2009-01-07 17:15:10
Qtopia free 2.2.0交叉编译详细过程
今天在Fedora 6主机上成功交叉编译Qtopia free 2.2.0,因为中间也经历了一些小波折,故特此撰文,希望能对进行同样工作的新手有所帮助。
一.环境描述
1. 开发环境
HOST环境:
系统:Fedora 6 完全安装
交叉工具arm 2.95.3
TARGET环境
arm 2410
320*240屏外加触摸屏
yaffs文件系统
软件:
cross-2.95.3.tar.bz2
qtopia-free-src-2.2.0.tar.gz
e2fsprogs-1.39.tar.gz
jpegsrc.v6b.tar.gz
libpng-1.2.14.tar.bz2
tslib-1.3.tar.bz2
zlib-1.2.3.tar.bz2
2. 准备路径
我的arm-linux-gcc已安装到/usr/local/arm/2.95.3/bin/,并已设置$PATH变量
我在home在建立了一个目录,并设置环境变量:
mkdir /home/qtopia-arm-home
设置环境变量:
export MYHOME="/home/qtopia-arm-home"
export PATH=$PATH:/usr/local/arm/2.95.3/bin
我将上面的两句写到一个文件中,存为script,执行
source /home/qtopia-arm-home/script
二、软件下载
1.cross-2.95.3.tar.bz2
下载地址:
2.qtopia-free-src-2.2.0.tar.gz
下载地址:
3.e2fsprogs-1.39.tar.gz
下载地址:
4.jpegsrc.v6b.tar.gz
下载地址:
5.libpng-1.2.14.tar.bz2
下载地址:
6.tslib-1.3.tar.bz2(触摸屏校正工具:也可以用QT自带的,这样就不必下载)
下载地址:
7.zlib-1.2.3.tar.bz2
下载地址:
三、编译步骤:
1. 得到本机运行版本uic 工具
为
了编译qtopia ,需要下载QT/Embedded,但是为了编译QT/Embedded,又需要QT/X11的
uic编译器(它将qt2-designer创建的UI格式的文件转换成cpp文件),你可以下载QT/X11编译生成uic,也可以从网上下载一个
uic。
cd $MYHOME
wget
下载后改变权限
chmod u+rx uic-qt2
然后建立一个目录
mkdir $MYHOME/nfs
将qtopia-free-2.2.0解压缩至$MYHOME/nfs/qtopia-free-2.2.0
设置环境变量:
export QPEDIR=$MYHOME/nfs/qtopia-free-2.2.0
export QTDIR=$QPEDIR/qt2
拷贝uic
cd $MYHOME
cp uic-qt2 $QTDIR/bin/uic
你也可以自己编译出来一个,不过需要较长时间。
解压qtopia-free-src-2.2.0.tar.gz到MYHOME,并改名为qtopia_x86
cd $MYHOME
tar zxvf qtopia-free-src-2.2.0.tar.gz
mv qtopia-free-2.2.0qtopia_x86
cd qtopia_x86
echo 'yes'|./configure
make
将其cp至 $QPEDIR
cp $MYHOME/qtopia_x86/qt2/bin/uic $QTDIR/bin/
2. 编译相关库
mkdir $MYHOME/arm/
将
上面的e2fsprogs-1.39.tar.gz.tar.gz,jpegsrc.v6b.tar.gz,libpng-
1.2.14.tar.bz2,tslib-1.3.tar.bz2,zlib-1.2.3.tar.bz2解压至$MYHOME/arm目录(你也可以
自己指定目录),并相应更名目录为 e2fs,jpeg,libpng,tslib,zlib。并建立mkdir $MYHOME/arm/lib
;mkdir $MYHOME/arm/include (这两个目录是存放编译后的库与头文件,为后面交叉编译用)
mkdir $MYHOME/arm/lib
mkdir $MYHOME/arm/include
然后分别编译:
1.e2fs:
cd $MYHOME/arm/e2fs
./configure
--host=arm-linux --enable-elf-shlibs--with-cc=arm-linux-gcc
--with-linker=arm-linux-ld --prefix=/usr/local/arm/2.95.3/arm-linux
make
cp lib/libuuid.so* ../lib
2.jpeg:
cd $MYHOME/arm/jpeg
./configure –enable-shared
gedit Makefile &
修改:
CC= arm-linux-gcc
AR= arm-linux-ar rc
AR2=arm-linux-ranlib
新手注意:第一个和后两个不在一起,你要搜索一下CC,AR找到后用#注释掉原来的,加上新的。
例如:
#AR= ar rc
AR= arm-linux-ar rc
make
cp *.h ../include/
cp libjpeg.a ../lib/
3.zlib:
cd $MYHOME/arm/zlib
./configure -shared
gedit Makefile &
修改:
[begin]
...
CC="arm-linux-gcc"
...
LDSHARED="arm-linux-gcc" -shared -Wl,-soname,libz.so.1
CPP="arm-linux-gcc" -E
...
AR="arm-linux-arrc"
RANLIB="arm-linux-ranlib"
...
prefix =/usr/local/arm/2.95.3/arm-linux
...
[end]
make
cp libz.so* ../lib/
cp *.h ../include/
4.libpng:
cd $MYHOME/arm/libpng
cp scripts/makefile.linux ./Makefile
gedit Makefile &
修改:
[begin]
...
AR_RC=arm-linux-ar rc
CC="arm-linux-gcc"
...
RANLIB="arm-linux-ranlib"
...
prefix="/usr/local/arm/2".95.3/arm-linux
...
[end]
make
cp libpng12.so* ../lib/
cp libpng12.so ../lib/libpng.so
cp *.h ../include/
5.tslib(如果准备用Qt自带的触摸屏校正工具可以不编译):
cd $MYHOME/arm/tslib
./autogen.sh
echo"ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache
./configure --host=arm-linux--cache-file=arm-linux.cache --enable-inputapi=no --srcdir=/home/qtopia-arm-home/arm/tslib
为了防止出现“libtool:link: only absolute run-paths are allowed“的错误,在/tslib/plugins/Makefile里面找rpath,找到将其注释并加上绝对路径。
#LDFLAGS :=$(LDFLAGS) -rpath $(PLUGIN_DIR)
LDFLAGS :=$(LDFLAGS) -rpath `cd $(PLUGIN_DIR) && pwd`
make
cp src/.libs/libts-0.0.so.0* ../lib/
cp src/.libs/libts.so ../lib/
cp src/*.h ../include/
3. 编译Qtopia
(1)准备:
建立安装目录:
mkdir $MYHOME/nfs/qtopia
修改文件
vi$MYHOME/nfs/qtopia-free-2.2.0/qtopia/mkspecs/qws/linux-arm-g++/qmake.conf
将此行
QMAKE_LIBS_QT = -lqte
修改为
QMAKE_LIBS_QT= -lqte -lpng -lts -lz -luuid -ljpeg
如果想让Qtopia自己支持触摸屏,需要修改$QPEDIR/src/qt/qconfig-qpe.h文件,定义相应的宏,在最后加上
#define QT_QWS_IPAQ
#define QT_QWS_IPAQ_RAW
在最后运行的时候,加上如下环境变量:
exportQWS_MOUSE_PROTO=TPanel:/dev/h3600_tsraw(触摸屏具体名称和位置可能需要根据实际情况修改)
如果想让Qtopia支持鼠标,需要修改$QPEDIR/src/qt/qconfig-qpe.h文件
注释如下部分:
/*
#ifndef QT_NO_QWS_CURSOR
#define QT_NO_QWS_CURSOR
#endif
#ifndef QT_NO_QWS_MOUSE_AUTO
#define QT_NO_QWS_MOUSE_AUTO
#endif
#ifndef QT_NO_QWS_MOUSE_PC
#define QT_NO_QWS_MOUSE_PC
#endif
*/
在最后运行的时候,加上如下环境变量:
exportQWS_MOUSE_PROTO=TPanel:/dev/h3600_tsraw(触摸屏具体名称和位置可能需要根据实际情况修改)
export QWS_MOUSE_PROTO=USB:/dev/input/mice
如果想让Qtopia支持USB标准键盘,在最后运行的时候,加上如下环境变量:
export QWS_KEYBOARD=USB:/dev/input/event0
(2)设置环境变量:
exportQPEDIR=$MYHOME/nfs/qtopia-free-2.2.0/qtopia
exportQTDIR=$MYHOME/nfs/qtopia-free-2.2.0/qt2
exportLD_LIBRARY_PATH=$QTDIR/libQPEDIR/lib
exportTMAKEDIR=$MYHOME/nfs/qtopia-free-2.2.0/tmake
exportTMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g++
(3)准备配置文件:
cp$QPEDIR/src/qt/qconfig-qpe.h $QTDIR/src/tools
cd$QPEDIR/src/libraries/qtopia
cpcustom-linux-ipaq-g++.cpp custom-linux-arm-g++.cpp
cpcustom-linux-ipaq-g++.h custom-linux-arm-g++.h
(4)开始configure
cd$MYHOME/nfs/qtopia-free-2.2.0
如果想让Qtopia自己支持触摸屏,用下面的命令:
echo'yes'|./configure -qte "-embedded -xplatform linux-arm-g++ -qconfig
qpe -no-qvfb-depths 16,24 -system-jpeg -system-libpng -system-zlib -gif
-thread -no-xft-release -I$MYHOME/arm/include -L$MYHOME/arm/lib -lpng
-lz -luuid -ljpeg"-qpe '-xplatform linux-arm-g++ -edition pda
-displaysize 320x240-I$MYHOME/arm/include -L$MYHOME/arm/lib
-prefix=$MYHOME/nfs/qtopia'
(5)make
make的过程中会出现一些错误,下面是我出现的错误和相应的解决办法,希望对你有用:
错误一:
/home
/qtopia-arm-home/nfs/qtopia-free-2.2.0/qt2/include/qvaluestack.h:57:错误:不
能从 ‘QValueListIterator
解决办法:
// remove( this->fromLast() );
this->remove(this->fromLast() );
错误二:
jpeglib.h错误
解决办法:
原因是在$MYHOME/nfs/qtopia-free-2.2.0/qtopia/src/3rdparty/plugins/codecs/libflash
中有一个jpeglib.h,但是它不是我们需要的,我们需要的已经拷贝在/home/qtopia-arm-home/arm/include中了,所以将其改名:
cd $MYHOME/nfs/qtopia-free-2.2.0/qtopia/src/3rdparty/plugins/codecs/libflash
mv jpeglib.h jpeglib.h.bak
编译成功了可以再该回来。
错误三:
/usr/local/arm/2.95.3/arm-linux/bin/ld:cannot find -ljpeg
解决办法:
拷贝libjpeg.a到arm/lib
错误四:
In file included fromvideocaptureview.cpp:54:
/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/../../../../arm-linux/sys-include/linux/videodev.h:5:linux/version.h:
?????????
make[6]: ***[.obj/release-shared/videocaptureview.o] 错误 1
解决办法:
在./usr/local/arm/2.95.3/arm-linux/sys-include/linux/videodev.h. 文件中把#include
错误五:
/usr/local/arm/2.95.3/arm-linux/bin/ld:warning:
libuuid.so.1, needed by /home/q
topia-arm-home/nfs/qtopia-free-2.2.0/qtopia/lib/libqpe.so,not found
(try using -rpath or-rpath-link)
/usr/local/arm/2.95.3/arm-linux/bin/ld:warning:
libts-0.0.so.0, needed by /home
/qtopia-arm-home/nfs/qtopia-free-2.2.0/qtopia/lib/libqte.so,not found
(try usin g -rpath or -rpath-link)
/usr/local/arm/2.95.3/arm-linux/bin/ld:warning:
libpng12.so.0, needed by /home/
qtopia-arm-home/nfs/qtopia-free-2.2.0/qtopia/lib/libqte.so,not found
(try using -rpath or-rpath-link)
/usr/local/arm/2.95.3/arm-linux/bin/ld:warning:
libz.so.1, needed by /home/qtop
ia-arm-home/nfs/qtopia-free-2.2.0/qtopia/lib/libqte.so,not found (try
using -rp ath or -rpath-link)
/home/qtopia-arm-home/nfs/qtopia-free-2.2.0/qtopia/lib/libqte.so:undefined refe rence to `uncompress'
解决办法:
是编译没带库编译了qmake 工具没生成
我是修改文件
/qtopia-free-2.2.0/qtopia/mkspecs/qws/linux-arm-g++/qmake.conf
将此行
QMAKE_LIBS_QT = -lqte
修改为
QMAKE_LIBS_QT = -lqte -lpng -lts -lz -luuid-ljpeg
参考
错误六:
../../libraries/qtopia/qdawg.cpp:294:
错误:有多余的限定 ‘QDawgPrivate::’
在成员 ‘QDawgPrivate’ 上
make[6]: *** [.obj/release-shared/qdawg.o] 错误 1
make[5]: *** [all] 错误 2
make[4]: *** [sub-tools-qdawggen] 错误 2
make[3]: *** [sub-src-components_pro] 错误 2
make[2]: *** [all] 错误 2
make[1]: *** [all] 错误 2
解决办法:
vi /home/qtopia-arm-home/nfs/qtopia-free-2.2.0/qtopia/src/libraries/qtopia/qdawg.cpp
// QDawgPrivate::~QDawgPrivate()
~QDawgPrivate()
终于编译成功啦!!!庆贺一下,请我吃饭,哈哈!
(5)将编译成功后的库拷贝到前面指定的安装目录:
makeinstall
命令结束后可以在$MYHOME/nfs/qtopia中看到qtopia的文件系统。
4. 收尾:
别忘了,还有一些库在$MYHOME/arm/lib中,拷贝这些库到qtopia的库中:
cp$MYHOME/arm/lib/* $MYHOME/nfs/qtopia/lib/
如果是用了tslib,还需要拷贝触摸屏校准/测试程序以及相关的库文件:
mkdir$MYHOME/nfs/qtopia/bin/tests
mkdir$MYHOME/nfs/qtopia/lib/ts
cp $MYHOME/arm/tslib/tests/.libs/ts_*$MYHOME/nfs/qtopia/bin/tests
cp$MYHOME/arm/tslib/src/.libs/libts-0.0.so.0* $MYHOME/nfs/qtopia/lib
cp$MYHOME/arm/tslib/src/.libs/libts.so $MYHOME/nfs/qtopia/lib
cp$MYHOME/arm/tslib/plugins/.libs/*.so $MYHOME/nfs/qtopia/lib/ts/
5. 运行:
在你的板子上设置运行环境变量
exportPATH=/bin:/sbin:/usr/bin:/usr/sbin:/qt/bin
exportLD_LIBRARY_PATH=/lib:/usr/lib:/qt/lib
export QWS_KEYBOARD=TTY
export LANG="zh"_CN
export TERMINFO_DIRS=/usr/etc
export ROOT="/root"
export QTDIR="/qt"
export QPEDIR="/qt"
exportQWS_MOUSE_PROTO=TPanel:/dev/h3600_tsraw
如果是用了tslib,还需要设置以下环境变量:
export TSLIB_TSDEVICE=/dev/h3600_tsraw
export TSLIB_CONSOLEDEVICE=/dev/vc/
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_CONFFILE=/qt/etc/ts.conf
export TSLIB_PLUGINDIR=$QTDIR/lib/ts/
export TSLIB_TSEVENTTYPE="H3600"
校准屏幕(5点校准)
如果是用tslib,启动下面的程序校准触摸屏:
通过nfs将/home/qtopia-arm-home/nfs挂载到你的板子,然后在你的板子上执行:
cd到你的qtopia/bin/tests
./ts_calibrate
运行
cd到你的qtopia/bin
./qpe
6. 说明:文中的牵扯路径大致如下:
MYHOME=/home/qtopia-arm-home
PATH=$PATH:/usr/local/arm/2.95.3/bin
$MYHOME-->
arm-->
lib
include
e2fs
jpeg
libpng
tslib
zlib
nfs-->
qtopia
qtopia-free-2.2.0-->
...
dqt
qtopia
qt2
...
7. 参考文档:
Qtopia PDA 2.2.2