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