今天在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
我将上面的两句写到一个文件中,存为,执行 source /home/qtopia-arm-home/
二、软件下载
1.cross-2.95.3.tar.bz2 下载地址: ftp://ftp.arm.linux.org.uk/pub/linux/arm/toolchain/cross-2.95.3.tar.bz2
2.qtopia-free-src-2.2.0.tar.gz 下载地址: ftp://ftp.trolltech.com/pub/qt/source/qtopia-free-src-2.2.0.tar.gz
3.e2fsprogs-1.39.tar.gz 下载地址: http://nchc.dl.sourceforge.net/sourceforge/e2fsprogs/e2fsprogs-1.39.tar.gz
4.jpegsrc.v6b.tar.gz 下载地址: http://superb-east.dl.sourceforge.net/sourceforge/libpng/libpng-1.2.14.tar.bz2
5.libpng-1.2.14.tar.bz2 下载地址: http://superb-east.dl.sourceforge.net/sourceforge/libpng/libpng-1.2.14.tar.bz2
6.tslib-1.3.tar.bz2(触摸屏校正工具:也可以用QT自带的,这样就不必下载) 下载地址: http://mail.pdaxrom.org/download/1.1.0beta4/src/tslib-1.3.tar.bz2
7.zlib-1.2.3.tar.bz2 下载地址: http://www.zlib.net/zlib-1.2.3.tar.gz
三、编译步骤: 1. 得到本机运行版本uic 工具 为了编译qtopia ,需要下载QT/Embedded,但是为了编译QT/Embedded,又需要QT/X11的 uic编译器(它将qt2-designer创建的UI格式的文件转换成cpp文件),你可以下载QT/X11编译生成uic,也可以从网上下载一个uic。 cd $MYHOME wget http://vanille.de/tools/uic-qt2 下载后改变权限 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 s/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'
如果想用tslib可以加上-tslib和-lts选项: echo'yes'|./configure -qte "-embedded -xplatform linux-arm-g++ -qconfig qpe-no-qvfb -depths 16,24 -system-jpeg -system-libpng -system-zlib -tslib -gif-thread -no-xft -release -I$MYHOME/arm/include -L$MYHOME/arm/lib -lpng -lts -lz-luuid -ljpeg" -qpe '-xplatform linux-arm-g++ -edition pda -displaysize320x240 -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<QMap<QString, QString> >’ 转换到 ‘const char*’,为实参 ‘1’(属于 ‘int remove(const char*)’) 解决办法: // 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. 文件中把#i nclude<linux/version.h>一行屏蔽
错误五: /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 参考 http://www.qtopia.org.cn/phpBB2/viewtopic.php?p=2560&sid=069a3e6e76d5327ef97f9ea1a22ff481
错误六: ../../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
|