安装:
1)download the qtopia-free-src-2.2.0.tar.gz
2)tar zxvf qtopia-free-src-2.2.0.tar.gz
3) cd qtopia-free-2.2.0
4) export PATH=$PWD/tmake/bin:$PATH
5)./configure,然后输入"yes"
6)make
7) make install
MagicARM的安装脚本:
#!/bin/bash
echo remove old dirs
rm -rf tmake
rm -rf qt
rm -rf qt-x11
rm -rf qtopia
echo Unpack all packages
tar xzvf tmake-1.11.tar.gz
tar xzvf qt-embedded-2.3.7.tar.gz
tar xzvf qt-x11-2.3.2.tar.gz
tar xzvf qtopia-free-1.7.0.tar.gz
echo rename
mv tmake-1.11 tmake
mv qtopia-free-1.7.0 qtopia
mv qt-2.3.7 qt
echo Start Install Qt-X11
cd qt-2.3.2
export QTDIR=$PWD
echo yes|./configure -static -no-xft -no-opengl -no-sm
make -C src/moc
cp src/moc/moc bin
make -C src
make -C tools/designer
make -C tools/qvfb
cp tools/qvfb/qvfb bin
strip bin/uic bin/moc bin/designer bin/qvfb
#cp bin/uic $QTEDIR/bin
cp bin/?* ../qt/bin
cd ..
#cp $QTDIR/bin/?* qt/bin
mv qt-2.3.2 qt-x11
echo Start Setting env-var
export QTDIR=$PWD/qt
export QTEDIR=$QTDIR
export QPEDIR=$PWD/qtopia
export TMAKEDIR=$PWD/tmake
export TMAKEPATH=$TMAKEDIR/lib/qws/linux-generic-g++
export PATH=$QTDIR/bin:$QPEDIR/bin:$TMAKEDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
echo Start build Qt/Embedded
cd qt
make clean
cp $QPEDIR/src/qt/qconfig-qpe.h src/tools
(echo yes; echo yes)|./configure -platform linux-generic-g++ -qconfig qpe -qvfb -depths 16,24,32
make -C src
cd ..
echo Start Build Qtopia
cd qtopia/src
./configure -platform linux-generic-g++
make
echo OK
Qtopia-2.2.0 Linux 程序的开发
1. 配置环境变量:source set-arm-env
export QTDIR=$PWD/qt
export QPEDIR=$PWD/qtopia
export TMAKEDIR=$PWD/tmake
export TMAKEPATH=$TMAKEDIR/lib/qws/linux-generic-g++
export PATH=$QTDIR/bin:$QPEDIR/bin:$TMAKEDIR/bin:$PATH
2. 新建程序hello.cpp,编写程序
3. progen -t app.t -o hello.pro
4. tmake -o Makefile hello.pro
5. 修改Makefile
LIBS = $(SUBLIBS) -L$(LIBDIR) -lm -lqte -lstdc++
6. make
7. 新建hello.desktop, 并添加执行权限chmod +x hello.desktop
[Desktop Entry]
Comment[]=A Hello Program
Exec=hello
Icon=Hello
Type=Application
Name[]=Hello
8. qvfb -width 480 -height 272 &
./hello -qws
或着,复制hello.desktop到Qtopia安装目录的apps/Applications目录下,复制hello到Qtopia安装目录的bin下,重启开发板即可在qpe中运行程序: qpe &
备注 安装时相关问题的处理方法:
问题一:
../include/qstring.h:199: error: cannot bind packed field '((QChar*)this)->QChar::ucs' to 'ushort&'
解决办法:qstring.h中
199 // ushort &unicode() { return ucs; }
200 ushort &unicode() { ushort& tmp = ucs; return tmp; }
问题二:
make[3]: /home/zozowit/cross/qt-embedded-free-3.3.4/bin/uic:命令未找到
解决办法:之后经过查找安装相关库支持:
libfreetype6-dev uuid-dev lib.jpeg62-dev libqt3-mt libpam0g-dev libpng12-dev
libbluetooth1-dev libpcsclite-dev pkg-config jpeg-6b
uic编译器(它将qt2-designer创建的UI格式的文件转换成cpp文件),你可以下载QT/X11编译生成uic,也可以从网上下载一个uic。
问题三:
/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]’:
成功编译的方法:
问题四:
/usr/bin/ld: skipping incompatible /home/hjcai/qt-arm/qte-arm-tslib/lib/libts.so when searching for -lts
/usr/bin/ld: cannot find –lts
读错误信息发现是编译到src/moc出现上述问题,
于是先:
echo yes |./configure -embedded arm -thread
cd src/moc
make
然后再:
echo yes |./configure -embedded arm –thread –qt-mouse-tslib –I$QTDIR/include –L$QTDIR/lib
make
此法不通,虽然编译通过,但触摸屏不可使
qt-embedded-free-3.0.4版本打上tslib补丁是可用的,转屏虽然./configure中无对应参数,但在运行前
export QWS_DISPLAY='Transformed:Rot90'即可实现转屏
问题五:
更改qt-2.3.2文件夹中src/tools/qvaluestack.h第57行源代码:
remove (this->formLast() );
为:
this->remove (this->formLast() );
问题六:
/arm-target/qt-2.3.7/include/qsortedlist.h:51: error: there are no arguments to `clear' that depend on a template parameter, so a declaration of `clear' must be available
改成this->clear()
然后从/usr/bin下吧uic文件拷到qt的bin下
./configure -prefix /usr/qtopiacore3 -xplatform qws/linux-arm-g++ -thread -embedded arm -depths 16 -no-qvfb -qt-gfx-transformed -nomake examples -qt-mouse-tslib -I/home/zozowit/cross/tslib_build/include -L/home/zozowit/cross/tslib_build/lib
错误七:
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() );
错误九:在Build Qt2.3.2时make出现如下问题:
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
问题十:
g++ -c -pipe -Wall -W -O2 -D_REENTRANT -DQT_NO_QWS_VFB -DQTOPIA_DATA_LINKING -DQTOPIA_TARGET=\"qdawggen\" -DQTOPIA_TRTARGET=\"qdawggen\" -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -DQT_SHARED -I/root/qtopia-free-2.2.0/qtopia/mkspecs/linux-g++ -I. -I/root/qtopia-free-2.2.0/dqt/include -I/root/myqpe/include -I../../../include -I/root/qtopia-free-2.2.0/dqt/include -I.ui/release-shared/ -I.moc/release-shared/ -o .obj/release-shared/qdawg.o ../../libraries/qtopia/qdawg.cpp
../../libraries/qtopia/qdawg.cpp:294: error: extra qualification 'QDawgPrivate::'on member 'QDawgPrivate'
问题估计是出在主机编译器gcc的版本上,因为使用redhat是可以成功编译的,不过这里也不管那么多了,解决这个问题再说吧。
解决方法首先想到的是不编译这个程序。那么怎样达到这个目的呢?因为qtopia下的所有的makefile都是由qtopia-free-2.2.0/src/general.pri这个文件产生的,因此在这里可以将qdawggen这个程序从tools里面的程序清单中去除,这样在编译前的makefile产生阶段就不会产生关于qdawggen这个程序的选项,从而达到不编译这个程序的目的。
从这个问题的解决可以知道,如果要对qtopia进行裁剪可以从这个
qtopia-free-2.2.0/src/general.pri文件入手,这个文件列出了所有要编译的程序,只要在这里进行添加、删除相应的程序选项就可以达到裁剪qtopia自带程序与功能的目的。