打印
[ZLG-ARM]

Qtopia free 2.2.0 交叉编译详细过程

[复制链接]
1965|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qtopia|  楼主 | 2009-7-4 13:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天在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

相关帖子

沙发
auzxj| | 2009-7-4 13:31 | 只看该作者

mark

使用特权

评论回复
板凳
lpc2410| | 2009-7-6 13:18 | 只看该作者

不好弄

使用特权

评论回复
地板
chun1chun| | 2009-7-7 13:22 | 只看该作者

真的不错

使用特权

评论回复
5
tmake| | 2009-7-9 13:31 | 只看该作者

这玩意儿太难搞了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

125

帖子

0

粉丝