PC 机: 操作系统fedora 8 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
toolchain: Gouceg++ 2007q3版本
Omap3530: linux<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2.6.22
源代码: tmake-1.13.tar.gz qt-embedded-2.3.10-free.tar.gz qt-x11-2.3.2 .tar.gz
依赖库: e2fsprogs-libs-1.37 ext2 文件系统工具包
jpeg-6b jpeg 解码库
tslib 触摸屏工具包
libstdc++ C++标准库
作者:gurongjiang
http://blog.ednchina.com/gurongjiang/
序
最近到手的这块OMAP35xEVM,虽然非常强大,奈何只是一个评估板子,里面几乎没有什么应用,到现在我对linux下怎么控制DSP核,SGX核等都没有完全搞清楚。算了这些先放一放,以前一直想搞QT,可惜原来的s3c2440太老了,是03年的,只有16M的NORFLASH,只能玩玩minigui了,现在就用这个OMAP做QT玩玩吧,百度了一下,用这个板子的人几乎没有,资料就更少的可怜了,只能自己动手了,根据博创的2410移植QT的手册照猫画虎,花了整整两天终于弄好了。其中有很多问题的解决还是很花心思,给大家分享下。
一. PC上QTE的移植
(1)解压安装包并设置环境变量
把上面的源文件都复制到: /Qt
1.安装Tmake
cd /Qt
tar –xzf tmake-1.13.tar.gz
export TMAKEDIR=$PWD/tmake-1.13
2.安装Qt 2.3.2
cd /Qt
tar –xzf qt-x11-2.3.2.tar.gz
export QT2DIR=$PWD/qt-2.3.2
3.安装Qt/Embedded
cd /Qt
tar –xzf qt-embedded-2.3.10-free.tar.gz
export QTEDIR=$PWD/qt-2.3.10
环境变量的设置是非常重要的,它关系到能否正确的安装及编译这些安装包.
(2)编译
1.首先,要先编译出Qt,利用Qt的库编译QtE
1. Build Qt2.3.2
cd $QT2DIR
export TMAKEPATH=$TMAKEDIR/lib/linux-g++//利用tmake工具编译
export QTDIR=$QT2DIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
./configure -no-xft //出现选项时都输入yes
make
cp –arf bin/uic $QTEDIR/bin/ //新编译出的uic覆盖旧的
./configure 是对Qt 进行配置,它包括很多选项,例如可以通过添加“ -no-opengl”等,如果想要进一步了解可以通过键入 ./configure --help 来获得更多的帮助信息。编译完成后需要将生成的/bin/uic 复制到$QTEDIR 下新创建的目录bin 中,因为在随后编译
Qt/Embedded 的时候会用到这个工具。
编译的时候,源码是有错误的,修改方法如下:
错误信息:
xml/qxml.h:214: 警告:‘class QXmlReader’ 有虚函数却没有虚析构函数
xml/qxml.h:402: 警告:‘class QXmlContentHandler’ 有虚函数却没有虚析构函数
xml/qxml.h:419: 警告:‘class QXmlErrorHandler’ 有虚函数却没有虚析构函数
xml/qxml.h:428: 警告:‘class QXmlDTDHandler’ 有虚函数却没有虚析构函数
xml/qxml.h:436: 警告:‘class QXmlEntityResolver’ 有虚函数却没有虚析构函数
xml/qxml.h:443: 警告:‘class QXmlLexicalHandler’ 有虚函数却没有虚析构函数
xml/qxml.h:456: 警告:‘class QXmlDeclHandler’ 有虚函数却没有虚析构函数
xml/qxml.cpp:1518: 警告:未使用的参数 ‘ret’
/qt/qtx11/include/qvaluestack.h: In member function ‘T QValueStack<T>::pop() [with T = QMap<QString, QString>]’:
xml/qxml.cpp:513: instantiated from here
/qt/qtx11/include/qvaluestack.h:57: 错误:不能从 ‘QValueListIterator<QMap<QString, QString> >’ 转换到 ‘const char*’,为实参 ‘1’(属于 ‘int remove(const char*)’)
/qt/qtx11/include/qvaluestack.h: In member function ‘T QValueStack<T>::pop() [with T = QString]’:
xml/qxml.cpp:2502: instantiated from here
/qt/qtx11/include/qvaluestack.h:57: 错误:不能从 ‘QValueListIterator<QString>’ 转换到 ‘const char*’,为实参 ‘1’(属于 ‘int remove(const char*)’)
make[2]: *** [xml/qxml.o] 错误 1
make[2]: Leaving directory `/qt/qtx11/src'
make[1]: *** [sub-src] 错误 2
make[1]: Leaving directory `/qt/qtx11'
make: *** [init] 错误 2
成功编译的方法:
更改qt-2.3.2文件夹中src/tools/qvaluestack.h第57行源代码:
remove (this->formLast() );
为:
this->remove (this->formLast() );
configure时要使用以下语句:
./configure -debug -no-opengl -no-xft
2.编译Tmake工具QVFB,这是虚拟framebuffer的工具,在PC上方便调试
export TMAKEPATH=$TMAKEDIR/lib/linux-g++
export QTDIR=$QT2DIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
cd $QTEDIR/tools/qvfb
/ Qt/tmake-1.13/bin/tmake -o Makefile qvfb.pro //利用tmake生成qvfb的makefile
(上面指令不对可改用:/ Qt/tmake-1.13/bin/tmake qvfb.pro > makefile )
make
mv qvfb $QTEDIR/bin/ //把QtE中的qvfb执行程序替换成新编译出来的
另外:PC上启动FrameBuffer方法是修改:/etc/grub.conf。在kernel那句话后面加上
Vga=784 //640*480*16
重启生效
3. 最后编译我们的 Qt/Embedded(QtE)
cd $QTEDIR
export TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++
export QTDIR=$QTEDIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
./configure -no-xft -qvfb -depths 4,8,16,32
yes
5
make
在配置./configure 中-qvfb 用来支持Virtual framebuffer,-depths 4,8,16,32 支持4 位,8
位,16 位,32 位的显示深度,此外还可以添加如-syestem-jpeg 和-gif 来提供对jpeg 和gif
的支持。配置系统同时还支持对特定平台系统选项的添加,但一般来讲,凡是支持
framebuffer 的Linux 系统都可以使用“linux-generic-g++”平台。
编译过程出现错误:
错误一:
error: ‘QWSInputMethod’ has not been declared
修正方法:
cd $QTDIR/src/kernel //$DTDIR=/home/opiehome/qt-2.3.10
gedit qwindowsystem_qws.h
在前面增加以下两行
class QWSInputMethod;
class QWSGestureMethod;
错误二:
qvaluestack.h:57: 错误:不能从 ‘QValueListIterator<QString>’ 转换到 ‘const char*’,
为实参 ‘1’(属于 ‘int remove(const char*)’)
修正方法:
gedit $QTDIR/include/qvaluestack.h &
将remove( this->fromLast() );改为this->remove( this->fromLast() );
4. 查看是否成功
export QTDIR=$QTEDIR
export PATH=$QTEDIR/bin:$PATH //把QtE的工具导入环境
export LD_LIBRARY_PATH=$QTEDIR/lib:$QT2DIR/lib:$LD_LIBRARY_PATH
//链接QTE的库到环境中
cd $QTEDIR/examples/launcher
qvfb -width 640 -height 480 –depth 16 &
./launcher –qws
注意:这里后面的-depth 16必须加上,因为我的vga设置的是16位,要匹配,默认是32位,可能会打印不能达到32位的深度!
成功则如下:
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
到此,QTE在PC上的移植成功了!
二. 交叉编译QTE,到OMAP35xEVM上
(1).非常关键,导出自己的交叉编译工具链:
PATH=/opt/omapevm/toolchain/arm-2007q3/bin:$PATH
测试是否成功,直接在bash上输入工具,看看能不能Tab到。
更重要的是,Tmake编译QTE的时候,默认查找的是当前环境下的arm-linux-g++,我的编译工具名字不是这个,那么我们要做的就是在/opt/omapevm/toolchain/arm-2007q3/bin下新建链接:
ln –s arm-none-linux-gnueabi-gcc amr-linux-gcc
ln –s arm-none-linux-gnueabi-g++ amr-linux-g++
………….. //最好全部做个链接,保证不会出错
(2)交叉编译 Qt/Embedded
cd $QTEDIR
export TMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g++ //这个变了
export QTDIR=$QTEDIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
./configure -xplatform linux-arm-g++ -no-xft -no-qvfb -depths 4,8,16,32 //这个变了
Make
编译出错如果和前面一样,解决方法相同。
另外我遇到了新的错误如下:
error:
kernel/qpixmapcache.cpp:125:57: 错误:asm/page.h:没有那个文件或目录
In file included from kernel/qgfx_qws.h:39,
from kernel/qpixmapcache.cpp:112:
kernel/qimage.h: In member function ‘int QImageTextKeyLang::operator<(const QImageTextKeyLang&) const’:
kernel/qimage.h:58: 警告:建议在 || 的操作数中出现的 && 前后加上括号
kernel/qpixmapcache.cpp: In constructor ‘QSharedMemoryManager::QSharedMemoryManager()’:
kernel/qpixmapcache.cpp:539: 错误:‘PAGE_SIZE’在此作用域中尚未声明
kernel/qpixmapcache.cpp:539: 错误:‘PAGE_MASK’在此作用域中尚未声明
kernel/qpixmapcache.cpp: In member function ‘void QSharedMemoryManager::internal_free(QSMemPtr)’:
kernel/qpixmapcache.cpp:773: 错误:‘PAGE_SIZE’在此作用域中尚未声明
kernel/qpixmapcache.cpp:773: 错误:‘PAGE_MASK’在此作用域中尚未声明
make[2]: *** [kernel/qpixmapcache.o] 错误 1
make[2]: Leaving directory `/root/2410clQt/qt-2.3.10/src'
make[1]: *** [sub-src] 错误 2
make[1]: Leaving directory `/root/2410clQt/qt-2.3.10'
make: *** [init] 错误 2
解决方法是:
把/usr/include/asm/下的 page.h中关于PAGE_SIZE,PAGE_MASK的定义直接复制到kernel/qpixmapcache.cpp中。 我自己的方法,别人的方法是替换一个page.h。
这个编译,还不能完全编译,编译到后面会出现不能编译类的的错误,这是因为$TMAKEDIR/lib/qws/linux-arm-g++/ 下有个tmake.conf里面有两个配置的是arm-linux-gcc,
这里其实应该改为arm-linux-g++,不过编译不过去的是里面的example,我们需要的库文件已经编译好了。所以可以无视它了!
我们会在$QTEDIR/lib/目录下面看到
libqte.so
libqte.so.2
libqte.so.2.3
libqte.so.2.3.10
这些就是QTE的库文件。
(2)omap上QtE的依赖建立
如果相应的库你已经有了,就不必再搞了。
1. libstdc++的支持
这个工具不需要我们去交叉编译,交叉编译工具里面已经自带了编译好的这个,我们在toolchain/arm-2007q3/下面的lib中找到这些文件复制出来就好。
libstdc++.so
libstdc++.so.6
libstdc++.so.6.0.1
2. 字体的支持
这个在qt2.3.10/lib/fonts下面,把整个文件夹复制出来。
fonts
3. e2fsprogs-libs-1.37的支持
这个交叉编译很简单,这里不赘述。主要是完成对ext2的支持
libuuid.so
libuuid.so.1
libuuid.so.1.2
4. jpeg-6b jpeg 的支持
同上
libjpeg.so
libjpeg.so.62
libjpeg.so.62.0.0
5. tslib的支持
这个,我在另外一片博文章说过。它还有相关的配置文件和bin文件,另外参考
libts-0.0.so.0
libts-0.0.so.0.1.0
libts.la
libts.so
(3)测试我们的成果
1.新建一个文件夹。
我用的sd卡,在sd卡上新建:
#mkdir qte
#mkdir qte/lib
2.把上面蓝色的库文件和字体复制到qte/lib中
注意:这里sd卡必须是linux的文件系统比如ext2/3,fat的话链接文件会丢失!!
3.交叉编译example里面的hello工程
首先修改tmakeconf,前面提到这里默认是gcc,我们应该用g++
vi $ TMAKEDIR/lib/qws/linux-arm-g++/tmake.conf
将其中“TMAKE_LINK= arm-linux-gcc”
“TMAKE_LINK_SHLIB= arm-linux-gcc”
修改为:“TMAKE_LINK= arm-linux-g++”
“TMAKE_LINK_SHLIB= arm-linux-g++”
导出环境变量:
PATH = 交叉编译工具路径/bin:$PATH
export $TMAKEDIR=../tmake1.3 //根据自己的
export TMAKEPATH="/tmake" 的安装路径(如$TMAKEDIR)/lib/qws/linux-arm-g++
export QTDIR=……/qt-2.3.10
$TMAKEDIR/bin/tmake –o makefile progressbar.pro
Make
把编译好的文件夹hello复制到SD卡的 /qte 路径下。
4.板子的运行
把SD卡插到板子上,并挂载:
Mount /dev/mmcblockp1 /mnt
Cd /mnt
导出QTE执行的环境
export QTDIR="/usr/qte" //qt的路径
export QTEDIR="/usr/qte"
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
//把/mnt/qte/lib挂到bash的环境中,这样可以自动找到QTE的共享库
export QWS_SIZE=480x640 //fb的大小
export QWS_MOUSE_PROTO="TPanel:/dev/input/event1" //触摸屏驱动
cd /mnt/qte/hello
./hello –qws //运行
成功则如下:
用户555171 2009-11-9 15:48
akingqin_731290802 2009-10-27 14:18