Qtopia-core-opensource-4.2.2安装及Hello world移植到AT91SAM9261EK

来源:互联网 发布:gre书籍推荐 知乎 编辑:程序博客网 时间:2024/05/28 17:05
Qtopia-core-opensource-4.2.2安装及Hello world移植到AT91SAM9261EK

 
硬件环境
Ubuntu 8.04
AT91SAM9261EK开发板

准备工作:
1、Qtopia-core-opensource-4.2.2.tar.gz
2、crosstool(arm-none-linux-gnueabi-交叉编译器)
3、编译好的内核linux 2.6.24必须包含frambuffer设备支持
 
一、QT4版本安装
   如果你只是在linux下用下文提到的Qtopia-core-opensource-4.2.2编译你的ForArm的程序,那么这一部可以省略,我个人认为这一步是有必要的。因为安装了QT4后,写好的程序可以在主机上编译、运行看运行的效果,不用每次都下载到开发板上。而且安装也比较简单。
    在终端下运行命令:sudo apt-get install qt4-dev-tools qt4-doc qt4-qtconfig qt4-demos qt4-designer
   注意:在这个版本的软件包中,qt4-dev-tools 包含了Qt Assistant及QtLinguist等工具,因此不需要单独安装这两个工具。其它的,qt4-doc是帮助文档,包含了Qt中各个类库的详细说明以及丰富的例子程序,可以使用Qt Assistant 工具来打开阅读。qt4-qtconfig是配置Qt环境的一个对话框,一般默认就行了,很少有必要去更改。qt4-demos包含很多可以运行起来的可执行文件以及源代码。qt4-designer是用来设计GUI界面的设计器。
 
二 、安装Qtopia-core-opensource-arm

    下载Qtopia Core 4的源代码,建议到www.qtopia.org.cn下载, qtopia-core-opensource-src-4.2.2.tar.gz,解压
 
 # tar zxvf qtopia-core-opensource-src-4.2.2.tar.gz
 # cd qtopia-core-opensource-src-4.2.2
 
 (重要的一步)修改mkspecs/qws/linux-arm-g++下的qmake.conf文件,把文件里面的编译器指定为arm-none-linux-gnueabi
 用arm-none-linux-gnueabi-gcc和arm-none-linux-gnueabi-g++替代以下的arm-linux-gcc和arm-linux-g++
 QMAKE_CC = arm-linux-gcc
 QMAKE_CXX = arm-linux-g++
 QMAKE_LINK = arm-linux-g++
 QMAKE_LINK_SHLIB = arm-linux-g++

 #./configure -no-largefile-no-qt3support -nomake tools -make examples -silent -xplatformqws/linux-arm-g++ -embedded arm -depths 16,18,24,32 -qt-kbd-tty-qt-kbd-usb -system-libjpeg -qt-gfx-transformed -confirm-license
 
 #make (时间很长,要有心里准备)
 
 #make install
 
注:上面./configure的参数中-system-libjpeg需要libjpeg库,必须在安装前先安装libjpeg库。否则会报错。

 
   为了使QT4.4的qmake和QtopiaCore-4.2.2-arm的qmake区别,我把QtopiaCore-4.2.2-arm中的bin目录下的qmake和ui等的文件名的首字母都改成了大写,也就是:Qmake,Ui等。然后修改/.bashrc修改PATH变量。具体步骤如下:
 #cd /usr/local/Trolltech# cd QtopiaCore-4.2.2-arm/bin/
 
 #mv qmake Qmake  //其他3个文件使用同样的操作,这里就不多说了
 #vim /.bashrc
 
 在最后一行加入
 export PATH=$PATH:/usr/local/Trolltech/QtopiaCore-4.2.2-arm/bin
 保存退出

到此Qtopia-core-opensource-arm已经安装成功。
 
三、hello world的移植


   使用的程序是Qtopia-core-opensource-arm的例程。位于/usr/local/Trolltech/QtopiaCore-4.2.2-arm/examples/tutorial/t1/目录下的main.cpp
   我们可以先用QT4编译后运行看效果。

#/usr/local/Trolltech/QtopiaCore-4.2.2-arm/examples/tutorial/t1/qmake -project
#/usr/local/Trolltech/QtopiaCore-4.2.2-arm/examples/tutorial/t1/qmake
#/usr/local/Trolltech/QtopiaCore-4.2.2-arm/examples/tutorial/t1/make
#/usr/local/Trolltech/QtopiaCore-4.2.2-arm/examples/tutorial/t1/./t1
然后我们把t1目录下编译生成的文件删除,只留下main.cpp
#/usr/local/Trolltech/QtopiaCore-4.2.2-arm/examples/tutorial/t1/Qmake -project
#/usr/local/Trolltech/QtopiaCore-4.2.2-arm/examples/tutorial/t1/Qmake

这样我们就生成了ARM板上可以运行的hello world程序了。
将生成的ARM可执行文件t1拷贝到ARM的文件系统中

#/usr/local/Trolltech/QtopiaCore-4.2.2-arm/examples/tutorial/t1/cp t1 /home/nfsboot/
 
   接下来我们将hello world运行需要的库复制到nfs目录下的lib文件夹内

#/usr/local/Trolltech/QtopiaCore-4.2.2-arm/lib/cp *so* /home/nfsboot/lib/

   创建字体库,用于显示文字。
  将usr/local/Trolltech/QtopiaCore-4.2.2-arm/lib/fonts/目录下的fontsdir以及以f开头的库拷贝到/home/nfsboot/usr/local/Trolltech/QtopiaCore-4.2.2-arm/lib/fonts/目录下。QT程序执行的时候默认是从该文件查找字体库。用命令:
#/usr/local/Trolltech/QtopiaCore-4.2.2-arm/lib/fonts/cp f* /home/nfsboot/usr/local/Trolltech/QtopiaCore-4.2.2-arm/lib/fonts/
   在ARM的终端下执行程序./t1 -qws &
   每个人的文件系统可能不同,不能保证一定可以运行,下面是我移植hello world遇到的一些问题及解决办法。
   
运行./t1 -qws报错记录
1
./t1: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
解决办法:将/usr/local/arm/arm-2008q1/arm-none-linux-gnueabi/libc/armv4t/usr/lib(交叉编译器目录)目录下的libstdc++.so.6 及相关的库拷贝到/home/nfsboot/lib/(nfs文件系统目录)目录下。
2、
./t1: error while loading shared libraries: libQtGui.so.4: cannot open shared object file: No such file or directory
解决办法:将/usr/local/Trolltech/QtopiaCore-4.2.2-arm/lib目录下的libQtGui.so.4文件及相关文件拷贝到/home/nfsboot/lib/
3、
./t1: error while loading shared libraries: libQtNetwork.so.4: cannot open shared object file: No such file or directory
与上面相同
4、
Cannot create Qtopia Core data directory: /tmp/qtembedded-0
原因:用户权限不够,把tmp目录chmod 777 tmp之后得到解决
5、
Qtopia Core data directory is not owned by user 0
原因:还是权限不够,把/etc目录下的几个初始化文件去掉之后不在报错。经过多次实验发现主要问题是因为/etc目录下的rc.S和fstab文件中的内容必须配置好。下面我将我的这两个文件内容贴出:
rc.S文件
#!/bin/ash
export PATH=/bin/:/sbin/:/usr/sbin/
echo "****rc.S run*****"
# automount (/etc/fstab)
mount -a
echo "mount -a run"
# remount root
echo "mount -o remount rw run"
mount -o remount rw /
fstab文件
/dev/ram0 / ext2 defaults 1 1
none /proc proc defaults 0 0
/dev/ram1 /tmp ramfs defaults 0 0
/dev/ram2 /var ramfs defaults 0 0

6、
Can't open framebuffer device /dev/fb0
…………
Can't open framebuffer device /dev/fb0
原因:没有挂载fb0,没有fb0设备,在/home/nfsboot/dev/目录下mknod fb0 c 29 0
7、
QFontDatabase: Cannot find fontdefinition file/usr/local/Trolltech/QtopiaCore-4.2.2-arm/lib/fonts/fontdir - is Qtinstalled correctly?
原因:字体文件找不到
解决:将主机上的fontdir拷贝到文件系统的/usr/local/Trolltech/QtopiaCore-4.2.2-arm/lib/fonts/下。再将一些字库拷贝到目录下即可。
8、
经过多次实验对比发现,QTopia中英文字库比较合适的是QTopia目录下/lib/fonts/f*(f*代表以f开头的字库)。