Qt 4.6.3 移植到mini2440的详细记录 (基于CentOS - 5.4)

来源:互联网 发布:致远网络 编辑:程序博客网 时间:2024/06/07 09:54

转自: 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.1.2 arm920t-eabi.tar.gz //我使用的是3.4.5版本的

触摸屏校验工具 : tslib1.4

PC虚拟机运行的OS :CentOS-5.4

 

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.     安装触摸屏校验工具 :

   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.04QT 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 /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/usr/local/tslib/include -L/usr/local/tslib/lib -v-D__ARM_ARCH_5TEJ__

# gmake

# gmake install

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

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

 

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

内容如下 :

 

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

# source setenv-embedded.sh

 

 5.    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

 


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

# make

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

 

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机相同的界面了,如果走不到这一步,呵呵,自己看着办吧。

PS : 错误调试部分还没有时间整理,整理好了发上来分享,嘻嘻,故事待续..

 

使用4.3.2交叉编译器基本上没出现什么错误,但是使用3.4.5

刚开始编译出现了以下错误:text/qfontengine_ft.cpp: In member function `bool QFontEngineFT::init(QFontEngine::FaceId, bool, QFontEngineFT::GlyphFormat)':
text/qfontengine_ft.cpp:696: warning: converting to `int' from `qreal'
{standard input}: Assembler messages:
{standard input}:781: Error: register or shift expression expected -- `orr r3,r2,lsl#16'
{standard input}:792: Error: register or shift expression expected -- `orr r2,r3,lsl#16'
{standard input}:7752: Error: register or shift expression expected -- `orr r3,r0,lsl#16'
{standard input}:7765: Error: register or shift expression expected -- `orr r1,r0,lsl#16'
make[1]: *** [.obj/release-shared-emb-arm/qfontengine_ft.o] 错误 1
make[1]:正在离开目录 `/usr/local/qt/qt-everywhere-opensource-src-4.6

苦思不得其解,最后还是上网查了查,发现解决方法为:

把~/qt-everywhere-opensource-src-4.6.0/src/3rdparty/freetype/include/freetype/config/ftconfig.h 这个文件的第330行改一下

原来是:

"orr %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */

改成:

"orr %0, %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */

这个问题解决了,删除原来的目录重新解压继续编译,又出现以下错误:../3rdparty/javascriptcore/JavaScriptCore/wtf/Platform.h:298:6: #error "Not supported ARM architecture"
make[1]: *** [obj/release/pcre_compile.o] 错误 1
make[1]:正在离开目录 `/usr/local/qt/qt-everywhere-opensource-src-4.6.3-arm/src/script'
make: *** [sub-script-make_defaulrgefile

解决方法:add a line in your ./configure parameters, such as "-D__ARM_ARCH_5TEJ__" , or whichever architecture definition that suits the platform.
就是在./configure参数后面增加一个"-D__ARM_ARCH_5TEJ__"

所以前面的配置参数应该为./configure -qt-kbd-tty -qt-gfx-linuxfb -no-gfx-transformed -no-gfx-multiscreen -qt-mouse-pc -no-gfx-qvfb -no-gfx-vnc -qt-kbd-tty -qt-gfx-linuxfb -no-gfx-qvfb -no-gfx-vnc -qt-mouse-tslib -no-glib -prefix /usr/local/Trolltech/qte4.6.3-arm -embedded arm -release -shared -fast -no-largefile -qt-sql-sqlite -no-qt3support -no-xmlpatterns -no-mmx -no-3dnow -no-sse -no-sse2 -no-svg -no-webkit -qt-zlib -qt-gif -qt-libtiff -qt-libpng -qt-libmng -qt-libjpeg -make libs -nomake tools -nomake examples -nomake docs -nomake demo -no-nis -no-cups -no-iconv -no-dbus -no-openssl -xplatform qws/linux-arm-g++ -little-endian -qt-freetype -depths 16,18 -I/usr/local/tslib/include -L/usr/local/tslib/lib -v -D__ARM_ARCH_5TEJ__

继续编译没有什么错误了,然后make install

最后是cp lib和字体,以及设置环境变量。到这里移植先告一段落!

 

 

出现错误“lib/libQtGui.so: undefined reference to `ts_read_raw'”

   lib/libQtGui.so: undefined reference to `ts_open'

   lib/libQtGui.so: undefined reference to `ts_fd'

   lib/libQtGui.so: undefined reference to `ts_config'

   lib/libQtGui.so: undefined reference to `ts_close'

   lib/libQtGui.so: undefined reference to `ts_read'

  解决方法:将 mkspecs/common/linux.conf中的QMAKE_LIBS_THREAD变量添加一个参数“-lts”,如下所示,保存后,继续编译:          
   QMAKE_LIBS_THREAD     = -lpthread -lts

 

原创粉丝点击