ubuntu系统下移植Qt到开发板的个人总结

2019-07-13 06:25发布

1.首先介绍Qt的各个版本 (1)什么是QT:Qt是一个完整的C++应用程序开发框架。它包含一个类库,和用于跨平台开发及国际化的工具。Qt API在所有支持的平台上都是相同的,Qt工具在这些平台上的使用方式也一致,因而Qt应用的开发和部署与平台无关。 (2)什么是Qtopia:Qtopia是一个面向嵌入式Linux的全方位应用程序开发平台,同时也是用于基于Linux的PDA(个人数字助理),智能电话(Smartphone)以及其他移动设备的用户界面。简单地说,Qtopia实质上是一组关于PDA和智能电话的应用程序结合,如果需要开发这类产品可以在这组程序的基础上迅速构建出PDA或者智能电话。Qtopia实质上依赖Qt/Embedded。 (3)什么是Qt/Embedded:它是一个完整的自包含GUI和基于Linux的嵌入式平台开发工具。这个开发工具的名字好像最容易混淆,当然Qt/Embedded是最熟悉的名字,好像 Qtopia Core说的也是它。最近,奇趣公司又该名字了,它的新名字叫做qt-embedded-linux-xxxx,看来这个Qt/Embedded的马甲还很多哈。 2.qt-x11,qt-embedded-x86,qt-embedded-arm各版本的理解 qt-x11版本可以产生Qt开发工具,如designer等等,最重要的是可以得到qvfb,嵌入式的开发有了qvfb,就可以不需要实际的开发板,也可以开发Qt应程序。 qt-embedded版本就是专门用于嵌入式方面的版本,qt-embedded有两个复制:qt-embedded-linux-opensource-src-4.4-x86 和qt-embedded-linux-opensource-src-4.4-arm,根据他们的名字可以知道前者是适合x架构的,后者适 合arm架构。 为什么需要两个呢?如果有开发板的话,可以只编译qt-embedded版本成arm架构的就可以了,但是很多时候用qvfb的话,开发会方 便很多,所以多编译一个x86架构的也不错。 这里是否有些疑问,qt-x11也是适合x86结构的,这不是和qt-embedded重复了吗?答案是这样 的,qt-embedded版本只能在嵌入式板子上面运行,编译成x86架构的程序也只能在x86的嵌入式板子上跑。前面说过,我们需要qvfb来开发, 但是qvfb只能执行x86架构的应用程序,所以需要让qt-embedded生成关于x86的库和其他文件。 而将qt-embedded编译成arm, 又是为什么呢?道理很简单,我最终的qt应用程序需要在arm架构上面运行,当然需要这方面的库,所以编译成arm也就顺理成章了。 好了,现在简单的总结 一下,首先,使用qt-x11提供的库和开发工具开发出qt应用程序,然后使用qt-embedded关于x86库和工具再次编译我们开发qt应用程序, 这是所得到的可执行文件就可以在qvfb上运行了,最后,使用qt-embeddedd的arm库再次编译就可以得到在arm上能运行的可执行程序。很明 显,如果有开发板,第二步是可要可不要的(最好是要),如果没有开发板的话,第三步也就没必要了,这样就不需要将qt-embedded编译成适合arm 架构的。 3.ubuntu下各版本Qt环境的设置 我的开发环境:【操作系统】:Ubuntu 12,【交叉编译器】:armlinux-gcc 具体步骤与说明: 1. 下载源码包 qt-x11-opensource-src-4.5.tar.gz qt-embedded-linux-opensource-src-4.5.tar.gz 2.编译及安装qt-x11-opensource-src-4.5.0 qt-x11版本可以产生Qt开发工具,如designer等等,最重要的是可以得到qvfb,嵌入式的开发有了qvfb,就可以不需要实际的开发板,也可以开发Qt应程序。 #tar zxvfqt-x11-opensource-src-4.5.0.tar.gz #cdqt-x11-opensource-src-4.5.0 #./configure #make #make install 历经漫长的编译过程,约一个半小时,默认安装在/usr/local/Trolltech/Qt-4.5.0下.编译完成后源程序不要删除,还有用。 3.编译及安装qt-embedded-linux-opensource-src-4.5.0 在root目录下建立一个src目录,用于存放编译源文件qt-embedded-linux-opensource-src-4.5.0.tar.gz。将其解压得到qt-embedded-linux-opensource-src-4.5.0,重命名为qt-embedded-linux-opensource-src-4.5.0-x86。再次解压qt-embedded-linux-opensource-src-4.5.0.tar.gz,并重命令为qt-embedded-linux-opensource-src-4.5.0-arm.为什么有两个复制呢?我们可以从他们的名字上就不难看出前者是适合x架构的,后者适合arm架构的,如果有开发板的话,可以只编译qt-embedded版本成arm架构的就可以了,但是很多时候用qvfb的话,开发会方便很多,所以多编译一个x86架构的也不错。 #mkdir ~/src #mvqt-embedded-linux-opensource-src-4.5.0.tar.bz2~/src #tar zxvfqt-embedded-linux-opensource-src-4.5.0.tar.gz #mvqt-embedded-linux-opensource-src-4.5.0 qt-embedded-linux-opensource-src-4.5.0-x86(重命名) #tar zxvfqt-embedded-linux-opensource-src-4.5.0.tar.gz #mv qt-embedded-linux-opensource-src-4.5.0qt-embedded-linux-opensource-src-4.5.0-arm(重命名) #cdqt-embedded-linux-opensource-src-4.5.0-x86 #./configure-prefix /usr/local/Trolltech/QtEmbedded-4.5.0-x86-embedded x86 –qvfb (编译x86) #make #make install 好的,qt-embedded-x86被安装在/usr/local/Trolltech/QtEmbedded-4.5.0-x86下. #cdqt-embedded-linux-opensource-src-4.5.0-arm #./configure-prefix /usr/local/Trolltech/QtEmbedded-4.5.0-arm-embedded arm (编译arm) #make #make install -------OK,qt-embedded-arm被安装在/usr/local/Trolltech/QtEmbedded-4.5.0-arm下. 至此我们已经安装好了qt-x11版(在PC机上运行的QT),qt-embedded-x86版(x86体系的嵌入式板子上运行的QT)和qt-embedded-arm(arm板子上运行的QT)。 4.设置各版本Qt的环境变量 (1)qt-x11: vi setenv.sh 添加如下内容: PATH=/usr/local/Trolltech/Qt-4.5.0/bin:$PATH LD_LIBRARY_PATH=/usr/local/Trolltech/Qt-4.5.0/lib:$LD_LIBRARY_PATH 保存退出.移到/usr/local/Trolltech/Qt-4.5.0中。 cdqt-x11-opensource-src-4.5.0 cd /tools/qvfb make --会在qt-x11-opensource-src-4.5.0/bin下生成qvfb,我们将它copy至/usr/local/Trolltech/QtEmbedded-4.5.0-x86/bin下 cp ../..bin/qvfb/usr/local/Trolltech/QtEmbedded-4.5.0-x86/bin (2)qt-embedded-x86: vi setenv.sh 添加如下内容: QTEDIR=/usr/local/Trolltech/QtEmbedded-4.5.0-x86 PATH=/usr/local/Trolltech/QtEmbedded-4.5.0-x86/bin:$PATH LD_LIBRARY_PATH=/usr/local/Trolltech/QtEmbedded-4.5.0-x86/lib:$LD_LIBRARY_PATH 保存退出.移到/usr/local/Trolltech/QtEmbedded-4.5.0-x86中。 (3)qt-embedded-arm: vi setenv.sh 添加如下内容: QTEDIR=/usr/local/Trolltech/QtEmbedded-4.5.0-arm PATH=/usr/local/Trolltech/QtEmbedded-4.5.0-arm/bin:$PATH LD_LIBRARY_PATH=/usr/local/Trolltech/QtEmbedded-4.5.0-arm/lib:$LD_LIBRARY_PATH 保存退出.移到/usr/local/Trolltech/QtEmbedded-4.5.0-arm中。 (4)我们在运行的时候分别运行对应的脚本即可,比如我们要用qt-x11: cd/usr/local/Trolltech/Qt-4.5.0 source setenv.sh 然后就可以用qmake designer等工具了. 5.运行库移植到mini2440板 A. 准备工作 在PC 机上建立nfs 服务,共享root 目录,在mini 2440板mount。 B. 建立目录 在mini 2440板建立如下目录: /usr/local/Trolltech/QtEmbedded-4.5.0-arm/bin /usr/local/Trolltech/QtEmbedded-4.5.0-arm/lib/fonts /tslib C.复制字库文件 把PC 机上/usr/local/Trolltech/QtEmbedded-4.5.0-arm/lib/fonts目录上所有字库文件CP 到mini 2440上/usr/local/Trolltech/QtEmbedded-4.5.0-arm/lib/fonts上 D. 复制运行库 在PC 机上复制下列文件到mini 2440上/usr/local/Trolltech/QtEmbedded-4.5.0-arm/lib libQtGui.so.4libts-0.0.so.0 libQtCore.so.4 libQtNetwork.so.4 一般在PC 机上/usr/local/Trolltech/QtEmbedded-4.5.0-arm/lib/和/tslib/上可以找到上述文件。复制 时注意如果需要复制的文件是链接文件,则把被链接文件都要复制上。 E.复制触摸屏软件 复制PC 机上/tslib/目录上全部文件(含子目录)到mini 2440上/tslib 目录 F. 在开发板上建立环境变量。 修改开发板上/etc/profile 文件,增加以下内容: exportQTDIR=/usr/local/Trolltech/QtEmbedded-4.5.0-arm exportT_ROOT=/tslib exportPATH=$QTDIR/bin:$PATH exportTSLIB_CONSOLEDEVICE=none exportTSLIB_FBDEVICE=/dev/fb0 exportTSLIB_TSDEVICE=/dev/input/event0 exportTSLIB_PLUGINDIR=$T_ROOT/lib/ts exportTSLIB_CONFFILE=$T_ROOT/etc/ts.conf exportTSLIB_CALIBFILE=/etc/pointercal exportQWS_MOUSE_PROTO=tslib:/dev/input/event0 exportLD_LIBRARY_PATH=$T_ROOT/lib:$QTDIR/lib 修改mini 2440上/tslib/etc/ts.conf文件:把第二行# module_raw input 前面的#和空格去除,保存退 出。 G. 校准触摸屏 从新启动开发板,执行: cd / cd tslib/bin ./ts_calibrate 校准触摸屏 ./ts_test 测试触摸屏 如果正常,QT4 Embedded 移植成功! 6.QT4应用程序开发步骤如下: 1. 安装QT creator(linux) 下载QTcreator安装文件,记得是.bin格式的,如果下的是源码,还得重新编译,而前者可以直接安装。 安装完成之后,添加qmake,在工具-->选项-->QT4-->添加,选择我们上面移植的QT4.7库/opt/qt-4.7.4-arm/bin,选中qmake。 添加工具链,工具-->选项-->工具链-->添加,选择交叉编译工具,即arm-linux-gcc4.3.2。 这样载入工程后点击构建就可以交叉编译应用程序了。 3. 编写QT4应用程序 利用安装好的QT creator编写应用程序,并在x86平台上调试通过。 4. 交叉编译应用程序 将编写好的工程文件拷贝到Linux下,用第二步建立好的交叉编译平台,编译此程序。即产生了arm平台可执行文件。 其中设置可能需要修改,包括qmake、工具链、目标文件目录。 5. 移植到arm平台 将编译好的QT库文件(即第二步编译安装的,目录/opt/qt-4.7.4-arm)拷入文件系统中相同目录下,并将交叉编译好的应用程序拷入qt-4.7.4-arm目录下。 6. 编写开机运行脚本 在/bin目录下新建脚本 vimmyqt4application 内容如下: #!/bin/sh exporttslib_root=/usr/local/tslib exporttslib_tsdevice=/dev/input/event1 exporttslib_tseventtype=h3600 exporttslib_conffile=/usr/local/tslib/etc/ts.conf exporttslib_plugindir=/usr/local/tslib/lib/ts #exporttslib_calibfile=/etc/pointercal exporttslib_calibfile=/mnt/disk/pointercal exporttslib_plugindir=$tslib_root/lib/ts exporttslib_consoledevice=none exporttslib_fbdevice=/dev/fb0 exportqtdir=/ opt/qt-4.7.4-arm exportqt_qws_fontdir=/opt/qt-4.7.4-arm/lib/fonts exportld_library_path=$qtdir/plugins/qtopialmigrate/:$qtdir/qt_plugins/imageformats/:$qtdir/lib:/root/tslib/build/lib:$ld_library_path exportpath=/bin:/sbin:/usr/bin/:/usr/sbin:/root/tslib/build/bin if [ -c/dev/input/event1 ]; then        exportqws_mouse_proto="tslib:${tslib_tsdevice}"        if [! -s /mnt/disk/pointercal ] ; then                 rm /mnt/disk/pointercal                /usr/local/tslib/bin/ts_calibrate        fi else        exportqws_mouse_proto="mouseman:/dev/input/mice"        > tslib_calibfile fi exportqws_keyboard=tty:/dev/tty1 fb_size=$(cat/sys/class/graphics/fb0/virtual_size) #exportqws_display="linuxfb:mmwidth76:mmheight44:1" case"$fb_size" in 800,480) exportqws_display="linuxfb:mmwidth91:mmheight53:1" ;; 480,272) exportqws_display="linuxfb:mmwidth76:mmheight44:1" ;; *) exportqws_display="linuxfb:mmwidth91:mmheight53:1" ;; esac #exportqws_display=:1 exporthome=/mnt/disk/qte4home cd/opt/qt-4.7.4-arm ./myqt4application–qws 第3-21行设置有关tslib环境变量。 第23-29行设置有关qt4环境变量,这里增加了QT_QWS_FONTDIR环境变量的设置,不然可能导致以下错误: QFontDatabase:Cannot find font directory /usr/local/Trolltech/QtEmbedded-4.5.1/lib/fonts - is Qt installed correctly? 第31-49行判断用户是使用触摸屏还是鼠标设备,并使用不同的配置,这里需要说明的是:在OK6410配套文件中,这里设置得不对,会导致触摸屏没有反应! 其中-c表示文件存在且为字特殊文件时为真(/dev/input/event1为触摸屏设备,在linux3.0中为event2),-s表示文件存在且大小不为零时为真。 第83-85行切换到应用程序目录并运行。 7. 修改/etc/init.d/rcS 最后一行修改为:/bin/ myqt4application&