您的位置:首页 > 编程语言 > Qt开发

mini2440: qtopia 2.2.0 、qt4的移植

2013-10-11 17:41 375 查看
===========================qt4 的移植==============================

原文:http://blog.csdn.net/zjucxm/article/details/5845310

一般而言,Qt应用程序的内容可分为Qt库的编译,Qt库的移植和基于Qt的应用程序的移植。Qt库的编译所花费的耗线性时间代价是最长的,而Qt库的移植是比较简单的一个工作,只需要让串口发送数据到开发板上即可,笔者本人使用的是虚拟机提供的一个共享工具 wmwate-tools,在拷贝某些库的时候会出现不可以预知的错误,重试也无法解决这个问题,解决办法在于把库目录打包共享,这样的出错几率会比较低。最后,应用程序的移植,这部分所花费的非线性时间应该是最长的,在移植调试的过程中将会出现很多很多未能预知的问题,详细的解答将会在本文末尾出做详细笔录。 

 

(用红色标记的表示我与原作者不同之处)

1.     编译的环境和所需要资源 :
Qt源码包 :Qt4.6源码包 :qt-everywhere-opensource-src-4.6.3.tar.gz
http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.6.3.tar.gz
交叉编译工具: arm-linux-gcc 4.3.2

触摸屏校验工具 : tslib1.4
PC机OS :Fedora 17

 
2.     安装交叉编译器 :  (我使用arm-linux-gcc 4.3.2)
主要是解压后要在设置交叉编译器的路径信息,即要为它设置一个环境变量。
   把arm920t-eabi.tar.gz放到/opt目录下,解压该文件:

   # tar xzvf arm920t-eabi.tar.gz

必须说明的是,网上转载该交叉编译器解压开来,产生的是一个/opt/toolchains/arm920t-eabi目录,在这里我们进行目录移动处理,把解压开来的/opt/toolchains/arm920t-eabi目录下面的/toolchains目录的所有内容剪切到系统/opt下面去,同时删除解压开来的/opt目录。

   #gedit /root/.bashrc

   这是编辑/root/.bashrc文件的命令,在末行添加上交叉编译器的路径信息:

  


使用source命令重新执行刚修改过的初始化文件,而不必重启机器。

   # source /root/.bashrc

 

   #arm-linux-gcc -v
可以看到版本信息

3.     安装触摸屏校验工具 :  见我关于tslib1.4的移植笔记http://blog.csdn.net/huntinux/article/details/12612837

   把tslib-1.4.tar.gz放到/opt目录下

    #tar xvzf tslib-1.4.tar.gz

    #cd tslib

    #./autogen.sh

    #./configure --prefix=/usr/local/tslib --host=arm-linux ac_cv_func_malloc_0_nonnull=yes

    #make

    #make install

这样以后可以看到/usr/local/tslib下有了库文件,移植时会用到。

ps : host选项中malloc后面接着的是数字0,不是小写字母o.

 

4.     编译Qt-4.6.3库:

首先要明确的是,我们需要编译3种不同类型的Qt库,这些库都由源码包qt-everywhere-opensource-src-4.6.3.tar.gz根据不同的配置选项编译而来。
# cd /opt

把qt-everywhere-opensource-src-4.6.3.tar.gz复制到这个目录下面,并且解压成三份,并且重命名为Qt-4.6.3-pc,Qt-4.6.3-x86和Qt-4.6.3-arm。



另:图中FriendlyARM是新建的空目录,qtsdk-2010.04是QT Creator2.0的安装目录。Toolchains是交叉编译器的安装目录。

1)    进入qt-4.6.3-pc目录,直接运行configure信息并且编译,安装应用Qt库,在默认的情况下将会在/usr/local/Trolltech目录下生成Qt-4.6.3库目录。

# ./configure

# gmake

# gmake install

修改.bashrc信息

编译出来的基于PC机的Qt源码包大概是3.2 GB左右, Qt库大概是900+M本次编译出来的是914M,如果中间有出现什么情况终止了编译,那一定是一些系统库或者是工具没有安装好,在虚拟机装载系统的时候可以选择把大部分工具都装载进来。

 

2)    进入qt-4.6.3-x86目录,输入编译嵌入式Qt库配置命令,并且进安装,在默认的情况下,将会在/usr/local/Trolltech产生嵌入式Qt库:QtEmbedded-4.6.3。

# ./configure -embedded x86 -qt-gfx-qvfb -qt-kbd-qvfb -qt-mouse-qvfb

# gmake

# gmake install

安装下来的嵌入式Qt包大概有2.8G,Qt库大概是接近1G。

 

3)    进入qt-4.6.3-arm目录,输入编译基于arm处理器的配置命令。

# ./configure -prefix /nfs/busybox/fs_mini2440/usr/local/Trolltech/QtEmbedded-4.6.3-arm -opensource -confirm-license -release -shared -embedded arm -xplatform qws/linux-arm-g++ -depths 16,18,24 -fast -optimized-qmake -pch
-qt-sql-sqlite -qt-libjpeg -qt-zlib -qt-libpng -qt-freetype -little-endian -host-little-endian -no-qt3support -no-libtiff -no-libmng -no-opengl -no-mmx -no-sse -no-sse2 -no-3dnow -no-webkit -no-qvfb -no-phonon -no-nis -no-opengl -no-cups -no-glib -no-xcursor
-no-xfixes -no-xrandr -no-xrender -no-separate-debug-info -nomake examples -nomake tools -nomake docs -qt-mouse-tslib -I/nfs/busybox/fs_mini2440/usr/local/tslib1.4/include -L/nfs/busybox/fs_mini2440/usr/local/tslib1.4/lib

(注: 我直接将安装目录指定为网络文件系统目录
/nfs/busybox/fs_mini2440,这样下面就不必复制了。tslib1.4的目录也在网络文件系统下/nfs/busybox/fs_mini2440/usr/local/tslib1.4)

# gmake

# gmake install

编译顺利结束以后,将会在/usr/local/Trolltech/QtE-4.6.3-arm目录下面产生基于ARM处理器平台的Qt库,73M。

下图是编译出来的Qt库的一个容量信息。

 


在基于ARM的嵌入式版本的QT4安装成功以后,为了进行交叉编译,即在我们的PC机x86处理器上生成另一个处理器ARM可执行的文件,为此,需要一个脚本的文件的引导,

内容如下 : (用于将应用程序移植到arm开发板上)

 


# bash shell
# setenv-embedded.sh

QTDIR=/usr/local/Trolltech/QtEmbedded-4.6.3-arm
PATH=$QTDIR/bin:$PATH
MAINPATH=$QTDIR/man:$MAINPATH
LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export QTDIR PATH MAINPATH LD_LIBRARY_PATH


每次进行交叉编译之前,都必须执行这个脚本,执行命令如下 :

# source setenv-embedded.sh

 

 5.    Qt库的移植:

在对开发板的所有操作都必须在PC机的超级终端下完成,在超级终端上对各种文件的操作就是对基于ARM的嵌入式系统的操作。

在开发板的跟目录下新建两个目录:  
我的两个目录分别是: /usr/local/Trolltech/QtEmbedded-4.6.3-arm/   和 /usr/local/tslib1.4

# mkdir mini2440

# mkdir tslib

不管用什么方法,可以选用串口或者是SD卡传输,把PC机下面的/usr/local/Trolltech/QtEmbedded-4.6.3-arm/lib目录下面的所有文件全部拷贝过来开发板的/mini2440目录下面,同时,把触摸屏校验工具的安装目录/usr/local/tslib下面所有的内容都拷贝到开发板的/tslib目录下面去。修改相关的环境变量信息:

# vi /etc/profile

在该文件末尾处输入如下环境变量信息:

#export QTDIR=/mini2440
#export T_ROOT=/tslib
#export PATH=$QTDIR/bin:$PATH
#export TSLIB_CONSOLEDEVICE=none
#export TSLIB_FBDEVICE=/dev/fb0
#export TSLIB_TSDEVICE=/dev/input/event0
#export TSLIB_PLUGINDIR=$T_ROOT/lib/ts
#export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf
#export TSLIB_CALIBFILE=/etc/pointercal
#export QWS_MOUSE_PROTO=tslib:/dev/input/event0
#export LD_LIBRARY_PATH=$T_ROOT/lib:$QTDIR/lib

 

我开发板上的/etc/profile

#tslib1.4
export TSLIB_ROOT=/usr/local/tslib1.4
export TSLIB_TSDEVICE=/dev/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_CONSOLEDEVICE=none
export LD_LIBRARY_PATH=$TSLIB_ROOT/lib:$LD_LIBRARY_PATH
export PATH=$PATH:/usr/local/tslib1.4/bin

#qt-4.6.3
export QTDIR=/usr/local/Trolltech/QtEmbedded-4.6.3-arm
export PATH=$QTDIR/bin:$PATH
export QWS_MOUSE_PROTO=tslib:/dev/event0
export QT_QWS_FONTDIR=$QTDIR/lib/fonts/
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH


如果没有这句 export QT_QWS_FONTDIR=$QTDIR/lib/fonts/ 会出先如下错误:

QFontDatabase: Cannot find font directory .....

解答:http://blog.csdn.net/cgzhello1/article/details/7908820

6. 应用程序的移植:

首先,进入PC机开发环境目录,即/opt/qt-4.6.3-pc,系统默认情况下已经使用了Qt库:Qt-4.6.3,若想改变所使用的Qt库,必须编写相关的脚本来指定所使用的Qt库。

# mkdir hello

# cd hello

# vi hello.cpp

在hello.cpp中输入以下代码:

#include <QApplication>

#include <QPushButton>

int main(int argc, char *argv[])

{

QApplication app(argc,argv);

QPushButton b("Hello World !");

b.show();

QObject::connect(&b,SIGNAL(clicked()),&app,SLOT(quit()));

return app.exec();

}

执行一下命令:

# qmake -project

# qmake

# make

在make编译通过以后,在当前目录下将会产生一个名为hello的可执行文件,执行该可执行文件,将会在PC的显示器上显示出一个Hello
world的GUI。

上面是编译成pc机上的程序。下面编译成arm开发板上可用的程序。

#setenv-embedded.sh                                  (指定编译工具为主机上/nfs/busybox/fs_mini2440/usr/local/Trolltech/QtEmbedded-4.6.3-arm 中的工具)

# make clean

# qmake -project   重新生成.pro文件

# qmake              生成交叉编译的Makefile

# make

把hello目录拷贝到qt-4.6.3-arm目录下面去,执行qt-4.6.3-arm目录下面的脚本setenv-embedded.sh,往后系统将会用交叉编译器指定的编译方法来编译程序。

在/opt/qt-4.6.3-arm下执行#setenv-embedded.sh

而后根据一下步骤操作:

# cd /opt/qt-4.6.3-arm/hello

# make clean

# qmake –project   重新生成.pro文件

# qmake              生成交叉编译的Makefile

# make

在make编译以后,通过 #./hello可以看见hello可执行文件已经被更新了,原来的hello可执行文件已经被经过交叉编译后的新的hello可执行文件给替换掉了。同时也可以知道,新的hello可执行文件是可以在ARM平台执行的可执行代码,格式为elf,把该可执行文件移植到开发板的根目录下面,增加它在ARM平台的可执行权限:

# chmod +x hello

要让应用程序可执行文件得以运行,必须让设置开发板环境变量来让系统搜索到应用程序所用到的库以及相关调用,为了实现Tslib的正确运行,需要对如下的Tslib的环境变量进行配置:

 TSLIB_TSDEVICE //触摸屏设备文件名

      Default (no inputapi): /dev/touchscreen/ucb1x00

      Default (inputapi): /dev/input/event0

TSLIB_CALIBFILE //校准的数据文件,由ts_calibrate 校准程序生成

      Default: ${sysconfdir}/pointercal

TSLIB_CONFFILE //配置文件名

      Default: ${sysconfdir}/ts.conf

TSLIB_PLUGINDIR //插件目录

      Default: ${datadir}/plugins

TSLIB_CONSOLEDEVICE //控制台设备文件名

      Default: /dev/tty

TSLIB_FBDEVICE //FrameBuffer设备名

      Default: /dev/fb0

 

具体内容设置

   #export QTDIR=/mini2440              
   #export T_ROOT=/tslib
   #export PATH=$QTDIR/bin:$PATH
   #export TSLIB_CONSOLEDEVICE=none
   #export TSLIB_FBDEVICE=/dev/fb0
   #export TSLIB_TSDEVICE=/dev/input/event0
   #export TSLIB_PLUGINDIR=$T_ROOT/lib/ts
   #export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf
   #export TSLIB_CALIBFILE=/etc/pointercal
   #export QWS_MOUSE_PROTO=tslib:/dev/input/event0
   #export LD_LIBRARY_PATH=$T_ROOT/lib:$QTDIR/lib
环境变量的信息可以通过命令#echo $QTDIR来确认。

最后执行:

#./hello -qws &

你会发现开发板的屏幕上将会出现跟在PC机相同的界面了,如果走不到这一步,呵呵,自己看着办吧。

其他资料:
http://wuyuans.com/2012/11/qt4-8-3-transplant/#comments
blog.csdn.net/gary_123/article/details/2928740

=================qtopia 2.2.0 的移植==================

qtopia 2.2.0 的移植

参考:

http://blog.csdn.net/lxb316/article/details/4948726

http://blog.chinaunix.net/uid-20776117-id-1846972.html

http://hi.baidu.com/srtthjyfyjcstye/item/f8b6b91ba24405f964eabfea

http://www.cnblogs.com/zhangchaoyang/articles/1937551.html

http://blog.csdn.net/luyee2010/article/details/6601638

blog.csdn.net/gary_123/article/details/2928740

===========================实践==============================

弄了两天,各种出错,最后的错误: libqt-mt.so: undefined reference to ***.

放弃了。尝试移植qt4。成功!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: