分类: LINUX
2009-05-08 08:33:05
(二)交叉编译qpe
现在我们开始交叉编译qpe吧,不过要做好心理准备,因为整个过程将会遇到各种各样的问题, 失败是很平常的,关键是我们要挺过来,坚持和摸索是我们每一个计算机工作者的法宝,让我们开始吧,和PC上不同的地方我会用红色显示出来!
首先我们要准备编译资料,商家提供以下编译资料:
tmake-1.11.tar.gz ,qt-embede-2.3.7.tar.gz , qt-x11-2.3.2.tar.gz,qt-free-1.7.tar.gz,这些对编译PC上的QT/E的qpe足够了,不过在交叉编译qpe的时候,还差两份资料:e2fsprogs.1.35.tar.gz,jpegsrc.v6b.tar.gz,所以必须去网站上下载,也可以向别人索要。
同样我在/yehuo2410/下建立目录qt_arm作为交叉编译目录
好!我们开始分析脚本:
#cd /yehuo2410/qt_arm (拷贝上述所有压缩包到该目录包括e2fsprogs-1.35.tar.gz和jpegsrc.v6b.tar.gz两个压缩包)
当前目录为/yehuo2410/qt_arm
#tar xzvf +各个压缩包,解压到/yehuo2410/qt_arm,记得要解压e2...和jpegsrc....两个包哦
#mv tmake-11 tmake
#mv qt-2.3.7.tar.gz qt
#mv qt-2.3.2.tar.gz qt-x11
#mv qt-free-1.7.tar.gz qtopia
#cd qt-x11 转到这个目录开始编译相应的工具
#export QTDIR=$PWD 配置当前QTDIR
#echo yes | ./configure -static -ro-xft -no-opengl -no-sm 形成Makefile文件
#make -C src/moc 编译形成moc(元对象编译器)工具
#cp src/moc/moc bin 拷贝上一步生成的moc到当前目录的bin
#make -C src 这一步是必须的
以下两步形成设计器designer和虚拟帧缓冲器qvfb
#make -C tools/designer
这时候designer工具不会在tools/designer下形成,而是在当前目录(qt-x11的bin目录)下形成,故不用拷贝,你会发现qt-x11/bin下多了uic,和designer工具,uic首先形成,因为designer在编译是要用到uic工具,uic工具是qt中用来处理.ui文件的工具。
#make -C tools/qvfb
#cp tools/qvfb bin
#strip bin/uic bin/moc bin/designer bin/qvfb 是对各个工具可执行文件进行节优化
#cp /bin/* ../qt/bin 拷贝这些工具到 qt-x11的兄弟目录qt中的bin目录中,qt/bin中有三个文件:findtr,
qt20fix,qtrename140,而qt-x11/bin中也有,拷贝的时候系统问题是否覆盖(qt-x11/bin里的这三个文件是否覆盖qt/bin里的这三个文件?),我选择是。
# cd ..
下面开始配置环境变量,很多脚本都这样写
#export QTDIR=$PWD/qt
#export QTEDIR=$QTDIR
#export QPEDIR=$PWD/qtopia
#export TMAKEDIR=$PWD/tmake
#export TMAKEPATH=$TMAKEDIR/llib/qws/linux-arm-g++(常规g++编译器)这点就和PC上的不同了,qws目录中有很多包括手机,PDA和ARM之类的g++编译器。
#export PATH=$QTDIR/bin:$QPEDIR/bin:$TMAKEDIR/bin:$PATH
#export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH 配置了这里就不用配置
/etc./ld.so.conf文件了,同样,为了保险,我把上述信息写到了/etc/profile文件中并且在/etc/profile中的$PWD替换为/yehuo2410/qt_arm,我们不用担心以前编译的PC版本的qpe会受到影响,当我们真正要用到PC版本的qpe的时把/etc/profile里面的这一部分涉及的/yehuo2410/qt_arm字符修改成/yehuo2410/qt_x86字符就可以了,当然,设置完成以后注销系统以生效。
#cd ..
#cd qt
#make clean
再次强调以下步骤是必要的,否则会出现cannot fine -lqte问题
#cp $QPEDIR/src/qt/qconfig-qpe.h src/tools
在下一步中我发现编译PC上的qpe时做到这一步时,会问你两次(都回答yes),而这里只会问一次,当时我感到费解,因为和厂家提供的脚本不一样(厂商提供的脚本是echo yes;echo no) ,我担心是哪里出错了,但是我依然往下做,直到最后也没有出现这里的相关问题,所以就不用担心
#echo yes|./configure -platform linux-arm-g++ -qconfig qpe -qvfb -depths 16,24,32
#make -C src
上面没有问题的话那么我们开始准备编译qtopia目录内的东西啦!
#cd ..
如果你这样做:
cd qtopia/src
./configure -platform linux-arm-g++
make
那么会出现这样的错误:
cannot find -lqtopia以及uuid.h 找不到的问题
这是因为我们发现qtopia/lib中libuuid.so打头的相关连接文件是一个错误文件连接,因为找不到最终被链接的那个libuuid.so.6(具体名字我忘记了),所以矛盾转换为寻求新的libuuid.so打头系列的文件的问题,这个时候你得开始编译e2fsprogs了,只有通过编译才能形成新的libuuid.so打头系列的文件。
以下是具体编译方法:
当前目录为/yehuo2410/qt_arm
#tar --xzvf e2fsprogs.1.35.tar.gz
#cd e2fsprogs-1.35
#./configure -host=arm-linux -with-cc=arm-linux-gcc -with-linker=arm-linux-ld -enable-eld-shlibs
-prefix=/usr/local/arm/2.95.3/arm-linux
注意:这里prefix选项很重要,必须指定交叉编译工具2.95.3中的arm-linux,不要改成别的目录或者不指定prefix选项,
#make
#make install lib/uuid 安装到该目录
有个帖子上是这样写的:
/********************************************************/
#tar xzf e2fsprogs-1.35.tar.gz
#cd e2fsprogs-1.35
#./configure -host=arm-linux -with-cc=arm-linux-gcc -with-linker=arm-linux-ld -enable-elf-shlibs -prefix=/usr/local/arm/2.95.3/arm-linux
#make
#make install lib/uuid/
将e2fsprogs-1.35/lib/目录下uuid的文件夹复制到/armsys2410/qt_arm/qtopia/include下
将e2fsprogs-1.35/lib/中的libuuid.a libuuid.so libuuid..so.1 libuuid.so.1.2复制到/armsys2410/qt_arm/qtopia/lib下
/*********************************************************/
可是在/e2fsprogs-1.35/lib目录里我们想要的四个文件中只有libuuid.a文件存在,而根本就找不到libuuid.so libuuid.so.1(只有一个点号)以及libuuid.so.1.2,这个时候我发现/usr/local/arm/2.95.3/arm-linux/lib中生成了libuuid.so,libuuid.so.1,libuuid.so.1.2,后来我用file命令查看libuuid.so.1.2所属处理器类型是ARM。所以得到了这三个文件,那天下午我的Linux文件系统崩溃了,所以一切都要重来,当我又做到这一步时,编译e2fsprogs以后发现e2fsprogs-1.35/lib目录中和usr/local/arm/2.95.3/arm-linux/lib中都生成了libuuid.so,libuuid.so.1以及libuuid.so.1.2文件,而且都是支持ARM处理器的。
总结得:如果在e2fsprogs-1.35/lib中找不到libuuid.so,libuuid.so.1,libuuid.so.1.2三个文件,那么建议去看一下usr/local/arm/2.95.3/arm-linux/lib目录中是否存在这三个文件,如果不存在那就重新解压e2fsprogs-1.35.tar.gz,重来。
将e2fsprogs-1.35/lib/目录下uuid的文件夹复制到/armsys2410/qt_arm/qtopia/include下
将我们找到的libuuid.a libuuid.so libuuid..so.1 libuuid.so.1.2复制到/yehuo2410/qt_arm/qtopia/lib下
好!问题解决了。
如果你这样做:
cd qtopia/src
./configure -platform linux-arm-g++
make
那么会出现以下错误:
./usr/local/arm/2.95.3/arm-linux/bin/ld: cannot find -ljpeg
这是因为在qt目录内编译是configure文件默认配置为支持jpeg,然后在最后编译的时候找不到相关的链接库.这个时候我们需要压缩包jpegsrc.v6b.tar.gz,来解决这个问题,按照帖子上的操作:
/**********************************************/
下载jpegsrc.v6b.tar.gz到qtarm目录并解压,进入目录jpeg-6b:
./configure --enable-shared
make (得到libtools程序)
./configure --enable-shared
修改生成的Makefile文件:
prefix = /qtarm/qt (qte的路径)
CC =/usr/local/arm/2.95.3/bin/arm-linux-gcc
AR =/usr/local/arm/2.95.3/bin/arm-linux-ar rc
AR2=/usr/local/arm/2.95.3/bin/arm-linux-ranlib
cp jconfig.doc jconfig.h
mkdir -p /qtarm/qt/man/man1
make
生成的libjpeg.so在.libs下,将libjpeg.so拷贝到/usr/local/arm/2.95.3/bin/arm-linux/lib
/***************************************************************************/
我在jpeg-6b目录内使用ls命令找不到找不到libs目录(我忽略了点号),所以我按照惯例的方法
#locate libjpeg.so 发现/usr/lib目录下有一libjpeg.so打头系列文件,我当时很怀疑那不是我想要的文件,所以我在另外一台PC上再一次按照同样的方法安装Linux,发现刚安好的系统中/usr/lib中已经存在了这些文件,为了进一步证明它们不是我想要的libjpeg.so系列文件,我用file命令查看libjpeg.so.62.00发现是i386处理器的,所以我放弃了使用它们,无意间我在jpeg-6b/目录下使用了以下命令:
#cd .libs
#ls -l | grep libjpeg*
刚好发现了它们:
libjpeg.so-->libjpeg.so.62
libjpeg.so.62-->libjpeg.so.62.0.0
libjpeg.la-->../libjpeg.la
我用file命令查看这个链接库libjpeg.so.62.0.0发现是支持ARM处理器的,
总结得:我没找到.libs目录在哪里,错误的以为是/lib和/usr/lib
还有就是上述帖子最后一步:
生成的libjpeg.so在.libs下,将libjpeg.so拷贝到/usr/local/arm/2.95.3/bin/arm-linux/lib下.
应该是:
将/jpeg-6b/.libs目录下的libjpeg.la,libjpeg.so ,libjpeg.so.62 以及libjpeg.so.62.0.0拷贝到目录
/usr/local/arm/2.95.3/arm-linux/lib (没有bin)
好!这个问题解决了,再来:
cd qtopia/src
./configure -platform linux-arm-g++
make
应该就可以了,你通过了吗?,不要怕,再来,再来......一定会编译通过的。