本文以友善之臂的Mini6410嵌入式开发板为目标板,介绍ubuntu 12.04系统下,配置嵌入式Qt开发工具的过程。
一、背景
Qt是一个跨平台的开发工具,与本文相关的分支有3个,分别是Linux下的Qt桌面版(基于X Window),嵌入式桌面环境Qtopia(Qt Extended)和嵌入式基础类库Qt Embedded。
嵌入式桌面版拥有集成开发工具Qt Creator,方便进行Qt程序的设计,默认配置用于开发桌面程序,进行交叉编译设置(有时间待后文详述)后,可以直接编译嵌入式程序。
Qt Embedded也称Qt/E,是运行于嵌入式Linux的Qt基础类库,目前最高版本为4.8(不确定)。它的图形界面直接工作于Frame Buffer上,绕过了窗口管理系统,具有较高的效率,适于嵌入式环境。
Qtopia是一个嵌入式桌面环境,以Qt Embedded(某些版本称Qtopia Core)为基础,在后期改名为Qt Extended。它提拥有一个桌面,并供了手机/PDA中常用的基本功能软件(如电话本等),在4.4.3后官方停止开发。
二、准备工作
注意要在32位Ubuntu系统中进行配置,由于版本冲突多如牛毛,不要尝试64位系统。Qt开发环境需要不少工具包作为基础,有些可能是系统自带的,也有些可能是笔者先前配置系统时顺带安装的,读者可以参考推荐阅读中的系统配置过程。
可通过以下链接下载安装包或源码包,或从友善之臂提供的资料光盘中查找(SDK在x86-qte包中,不过版本为2010.01):
arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz(ARM交叉编译器)
arm-qte-4.7.0-20101105.tar.gz(ARM上的Qt/E库)
x86-qte-4.6.1-20100201.tar.gz(PC上运行的Qt/E模拟器)
arm-qt-extended-4.4.3-20101105.tgz(ARM上运行的Qtopia)
x86-qt-extended-4.4.3-20101003.tgz(PC上运行的Qtopia模拟器)
qt-sdk-linux-x86-opensource-2010.05.1.bin(Qt SDK开发环境)
(1) x86版本的Qt用于在PC上仿真运行为ARM开发的Qt程序,需要虚拟framebuffer工具qvfb,而这个工具的源码正好由SDK提供了。
(2) Qt/E移植到开发板上还需要tslib库(用于触摸屏校正),需要使用版本控制工具git下载,如需要应先安装git:
sudo apt-get install git
然后将源码目录下载至当前目录:
git clone https://github.com/kergoth/tslib
为编译tslib库,还需要安装若干工具:
sudo apt-get install autoconf automake libtool
若不安装,编译时会出现错误:
autoreconf: not found
(3)为编译Qt还要安装图形和视频开发包:
sudo apt-get install xorg-dev
sudo apt-get install libv4l-dev
安装后一个包时,会报告依赖关系错误,在Ubuntu软件中心中搜索libv4lconvert0和libv4l-0卸载(先卸哪个都一样,两个会被一起卸载)后再运行上条命令。不要用apt卸载,它会要求同时卸掉几十个包。
若不安装上述第一个包,会出现错误:
X11/extensions/XTest.h:No such file or directory(没有那个文件或目录)
不安装后一个,会出现错误:
linux/videodev.h: No such file or directory(没有那个文件或目录)
安装libv4l-dev后,还需要将头文件路径进行配置:
sudo ln -s /usr/include/libv4l1-videodev.h /usr/include/linux/
videodev.h
(4) 如果以前做过编译内核或其他开发配置工作,系统可能已经自带了一套Qt工具集,与本文配置对象不兼容(很多人就是卡在这里了),应当删除:
sudo rm /usr/bin/qmake
sudo rm /usr/bin/qmake-qt4
否则编译Qtopia时会出现错误:
Bootstrap QBuild: .. FAIL
(5) 网上很多介绍删除Qt Creator可以解决,其实是错的。
根据Qt安装提示,还应该检查以下包是否安装:
libglib2.0-dev
libSM-dev
libxrender-dev
libfontconfig1-dev
libxext-dev
libgl-mesa-dev
libglu-mesa-dev
在Ubuntu 12.04中,除第一个外,其他包应该都是最新版,第一个包因依赖关系冲突无法安装,好在不影响编译和运行。
三、安装与编译
1.安装SDK
进入sdk所在目录,在命令行中运行:
./qt-sdk-linux-x86-opensource-2010.05.1.bin
然后会出现图形界面安装,按提示下一步即可,程序安装目录为:
/opt/qtsdk-2010.05
2.安装arm编译器
进入编译器压缩包所在目录,执行命令:
tar xvzf arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz -C /
注意文件名后的-C是参数,再后面的"/"表示解压目录。执行完之后会将编译器安装在/opt/FriendlyARM/toolschain/4.5.1目录下。
安装后需要将编译器路径加入环境变量中,执行命令:
gedit ~/.bashrc
在文件最后加入一行:
export PATH=$PATH:/opt/FriendlyARM/toolschain/4.5.1/bin
3.编译tslib
进入tslib目录,依次执行:
./autogen.sh
./configure --host=arm-linux --prefix="自定义安装目录xxx"
make
sudo make install
configure命令中--prefix参数用来指定tslib的安装目录,例如"/home/xxx/lib/tslib",也可以不带此参数,则安装到默认目录/usr/local/tslib下,下文以"/xxx"指代tslib安装目录,请读者注意。
4.编译x86-qte-4.6.1
解压x86-qte-4.6.1压缩包包,可以使用图形界面右键菜单解压,也可使用命令:
gzip -dc x86-qte-4.6.1-20100201.tar.gz | tar -xvf -
友善之臂在压缩包中提供了编译脚本build-all,脚本开头会将先前的安装配置目录删除,对初次配置没有必要,且脚本中的命令参数与前面安装的SDK版本不同,建议进入解压目录后,将以下几步保存为脚本执行或依次输入执行:
cd /opt/qtsdk-2010.05/qt/tools/qvfb/
/opt/qtsdk-2010.05/qt/bin/qmake "QT_SOURCE_TREE=/opt/qtsdk-2010.05/qt"
make
cd - #返回上一个目录,即解压目录
tar xfvz qt-everywhere-opensource-src-4.6.1.tar.gz
cd qt-everywhere-opensource-src-4.6.1
echo yes | ./configure -opensource -embedded x86 -xplatform qws/linux-generic-g++ -qt-libtiff -qt-libmng -qvfb
make
sudo make install
x86-qte将被安装在/usr/local/Trolltech/QtEmbedded-4.6.1-i386目录下。
5.编译arm-qte-4.7.0
首先输入命令$arm-linux-gcc -v,检查交叉编译链arm-linux-gcc是否生效,若未生效,注销或重启电脑检查。
解压arm-qte-4.7.0压缩包包,进入解压目录执行:
tar xfvz qt-everywhere-opensource-src-4.7.0.tar.gz
cd qt-everywhere-opensource-src-4.7.0
echo yes | ./configure -opensource -embedded arm -xplatform qws/linux-arm-g++ -no-webkit -qt-libtiff -qt-libmng -qt-mouse-pc -no-mouse-linuxtp -no-neon -qt-mouse-tslib -I/xxx/include -L/xxx/lib
make
sudo make install
上述命令与友善之臂提供的脚本最大不同在configure命令中,一是参数顺序不同,二是在-qt-mouse-tslib参数后增加了-I和-L两项给出tslib头文件和库文件路径(/xxx是tslib安装目录)。这里的编译过程非常诡异,笔者至今也未明所以然,只能指出如下几点供读者参考:
arm-qte将被安装在/usr/local/Trolltech/QtEmbedded-4.7.0-arm目录下。
6.编译x86-qtopia-4.4.3
解压x86-qt-extended-4.4.3压缩包,进入解压目录,首先执行命令:
tar xzf qt-extended-opensource-src-4.4.3.tar.gz
将源码解压,在源码目录中找到文件:
qt-extended-4.4.3/src/libraries/qtopia/qphoneprofile.cpp
将其1026行改为:
QPhoneProfile::Schedule &QPhoneProfile::Schedule::operator=(const Schedule &other)
然后将下列命令保存为脚本执行:
mkdir /opt/QtEmbedded-4.4.3-i386
export QTOPIA_DEPOT_PATH=$PWD/qt-extended-4.4.3
export QPEDIR=/opt/QtEmbedded-4.4.3-i386/
export LC_ALL="zh_CN"
export LC_TIME="zh_CN"
export LC_MONETARY="zh_CN"
export LC_ADDRESS="zh_CN"
export LC_TELEPHONE="zh_CN"
export LC_NAME="zh_CN"
export LC_MEASUREMENT="zh_CN"
export LC_IDENTIFICATION="zh_CN"
export LC_NUMERIC="zh_CN"
export LC_PAPER="zh_CN"
export LC_CTYPE="zh_CN"
export LANG="zh_CN"
export LANGUAGE="zh_CN"
cd $QPEDIR
echo yes | $QTOPIA_DEPOT_PATH/configure -ui-type mobile -release -clean -sound-system oss -build-qt -no-sxe -no-ssl -no-v4l2 -no-vpn -no-phonon -no-libamr -dynamic-rotation -mediaengines cruxus -remove-mediaengine gstreamer,helix -pictureflow -remove-module bluetooth,drm -no-dbus -no-dbusipc -add-displaysize 240x320 -extra-qt-embedded-config"-qt-freetype -no-webkit -no-dbus -qt-gfx-transformed -qt-gfx-linuxfb" -extra-qt-config"-no-webkit" 2>&1 | tee ./qtopiaconfig.log
bin/qbuild 2>&1 | tee ./qtopiamake.log
bin/qbuild image
对友善之臂自带脚本的修改主要有:
① 按网文说法更改了语言设置,不过似无必要(未详细考证),编译输出的提示中会有乱码,好在不影响结果。
②将-sound-system参数值由alsa改为oss,否则会爆出alsa disabled错误。
③更改了编译输出目录为/opt/QtEmbedded-4.4.3-i386,方便以后使用。
2>&1 | tee ./qtopia???.log语句作用是将编译过程中的输出信息同时输出到屏幕和log文件中。
编译成功后,还要从/opt/qtsdk-2010.05/qt/bin目录下拷贝qvfb文件到/opt/QtEmbedded-4.4.3-i386/sdk/qtopiacore/host/bin目录下。
7.编译arm-qtopia-4.4.3
x86-qtopia-4.4.3的编译安装比较简单,友善之臂提供的编译安装脚本基本是可用的,笔者只是改了开头几个命令:
#!/bin/bash
mkdir /opt/QtEmbedded-4.4.3-arm/
export QTOPIA_DEPOT_PATH=$PWD/qt-extended-4.4.3
export QPEDIR=/opt/QtEmbedded-4.4.3-arm/
export PATH=/opt/FriendlyARM/mini6410/linux/arm-gcc-4.4.1/bin/:$PATH
export LC_CTYPE="en_US"
从最后一行起,往后与友善之臂原版的build-all脚本就完全一样了,修改目的还是将编译好的程序放在/opt/QtEmbedded-4.4.3-arm/目录下,方便以后使用。
四、配置Qt-Creator
菜单栏“工具”->“选项”->“构建与运行”,依次和图中相对应。
4.1.Qt版本
4.2.构建套件
4.3编译器
4.4 移植到开发板
进入/usr/local/Trolltech,对嵌入式qt进行打包,复制到开发板的相同目录下。
开发宿主机和开发板的联系方法,一是用minicom命令行操作。二是在文件夹下用FTP进行登录。
文件夹的工具栏“文件”--“连接到服务器”,打开如下窗口,选择FTP(需登录):
如图所示,依次填写上开发板的IP,密码等,然后连接,效果如下:
这样就可以任意的向开发板复制或删除东西。
这样可以直接复制和粘贴,具体如下:
4.5 打开minicom,对嵌入式QT进行解压,这样就可以使用Qt开发嵌入工程序了。
最终移植效果如下:
五、测试编译结果
(1)启动/opt/qtsdk-2010.05/qt/bin目录下的qfvb程序,然后进入/usr/local/Trolltech/QtEmbedded-4.6.1-i386/demos目录,任选一个子目录下的可执行文件,加-qws参数在命令行下执行,如执行成功则说明x86-qte编译成功。
(2)要测试x86-qtopia,进入/opt/QtEmbedded-4.4.3-i386目录,执行:
./bin/runqtopia
将显示出一个诺基亚手机界面。