一般而言,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.1.2 arm920t-eabi.tar.gz
触摸屏校验工具 : tslib1.4
PC虚拟机运行的OS :Red Hat Enterprise Linux 5
2. 安装交叉编译器 :
主要是解压后要在设置交叉编译器的路径信息,即要为它设置一个环境变量。
把arm920t-eabi.tar.gz 放到/opt 目录下,解压该文件 :
# tar xzvf arm920t-eabi.tar.gz
必须说明的是,网上转载该交叉编译器解压开来,产生的是一个/opt/toolchains/arm920t-eabi目录,在这里我们进行目录移动处理,把解压开来的/opt/toolchains/arm920t-eabi目录下面的/toolchains目录的所有内容剪切到系统/opt下面去,同时删除解压开来的/opt目录。
使用友善之臂带的arm-linux-gcc 4.3.2版本的交叉编译工具将会出现错误
#arm-linux-gcc -v 可以看到版本信息
#gedit /root/.bashrc
这是编辑/root/.bashrc文件的命令,在末行添加上交叉编译器的路径信息
:
3. 安装触摸屏校验工具 :
把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下有了库文件,移植时会用到。
安装该库的时候费了很大劲,重新安装了libtool,autoconf,automake,有时候或许版本太低或者不匹配,重新安装后,在automake中执行下./automake,如果autogen.sh执行出现错误,或者./configure 出现错误,可以把tslib里面的文件都执行一遍,尤其是aclocal.m4文件,aclocal文件,如果要重新开始,限制性./autogen-clean.sh,
如果安装不成功,将automake和autoconf重新安装一次,然后再/automake里面执行automake,然后到/tslib里面重新从autogen-clean.sh开始
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。
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。
进入/usr/local
进入qt-4.6.3-arm目录,输入编译基于arm处理器的配置命令。
修改文件夹下src/3rdparty/freetype/include/freetype/config/ftconfig.h,将第330行修改为:"orr %0, %0,%2, lsl #16/n/t" /* %0 |= %2 << 16 */,这个错误让偶差点崩溃。
设置环境变量:#export CPLUS_INCLUDE_PATH=/opt/arm920t-eabi/arm-angstrom-linux-gnueabi/include/c++:/opt/arm920t-eabi/arm-angstrom-linux-gnueabi/include/c++/arm-angstrom-linux-gnueabi,
可以在/root/./bashrc里面把这句添加进去
这段命令不知道是不是真正需要,还并不确定,为了使得编译不在半路出错,还是写上了,主要是让编译找到arm-linux-gcc的路径
./configure -prefix /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-openssl -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/usr/local/tslib/include -L/usr/local/tslib/lib
红色部分主用于指定tslib编译文件,不然的话可能会找不到,导致tslib的功能无法实现而使编译无法正常进行
#gmake
#gamke install
在编译的时候出现了错误,可以尝试将/opt/qt-4.6.3-arm/mkspecs/qws/linux-arm-g++/qmake.conf文件修改为下面的内容
# modifications to g++.conf
QMAKE_CC = arm-linux-gcc lts
QMAKE_CXX = arm-linux-g++ lts
QMAKE_LINK = arm-linux-g++ lts
QMAKE_LINK_SHLIB = arm-linux-g++ lts
缺少了链接选项
编译顺利结束以后,将会在/usr/local/Trolltech/QtE-4.6.3-arm目录下面产生基于ARM处理器平台的Qt库,73M。
下图是编译出来的Qt库的一个容量信息。
在基于ARM的嵌入式版本的QT4安装成功以后,为了进行交叉编译,即在我们的PC机x86处理器上生成另一个处理器ARM可执行的文件,为此,需要一个脚本的文件的引导,
内容如下 :
每次进行交叉编译之前,都必须执行这个脚本,执行命令如下 :
# source setenv-embedded.sh
1. Qt库的移植 :
在对开发板的所有操作都必须在PC机的超级终端下完成,在超级终端上对各种文件的操作就是对基于ARM的嵌入式系统的操作。
在开发板的跟目录下新建两个目录 :
# 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
参考
http://www.arm9home.net/read.php?tid=6758&page=e&#a
http://www.arm9home.net/read.php?tid-5161.html
http://hi.baidu.com/jiyeqian/blog/item/f46d26a2ff3f7da6caefd0d6.html
http://blog.csdn.net/dongliqiang2006/archive/2009/08/30/4500002.aspx
http://www.qtforum.org/article/27370/qtembedded-4-5-0-compile-make-error.html
http://blog.csdn.net/nicholas4856/archive/2010/07/03/5710283.aspx
http://blog.csdn.net/halechan/archive/2010/03/26/5421484.aspx
http://blog.csdn.net/nicholas4856/archive/2010/07/03/5710283.aspx