Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1178442
  • 博文数量: 181
  • 博客积分: 4968
  • 博客等级: 上校
  • 技术积分: 1867
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-13 21:52
文章分类

全部博文(181)

文章存档

2015年(2)

2013年(6)

2012年(22)

2011年(41)

2010年(27)

2009年(51)

2008年(32)

我的朋友

分类:

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'

       如果想用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 >’                转换到                ‘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. 文件中把#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   

阅读(2239) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~