Ubuntu下嵌入式Qt开发环境配置全攻略

时间:2021-04-25 18:43:40

    本文以友善之臂的Mini6410嵌入式开发板为目标板,介绍ubuntu 12.04系统下,配置嵌入式Qt开发工具的过程。本文中介绍的工具、大部分步骤和脚本来自开发板附带资料光盘,但其默认配置环境为老旧的Fedora 9.0,在ubuntu中配置过程已需要修正。 

一、背景 

    众所周知Qt是一个跨平台的开发工具,与本文相关的分支有3个,分别是Linux下的Qt桌面版(基于X Window),嵌入式桌面环境QtopiaQt Extended)和嵌入式基础类库Qt Embedded 

    嵌入式桌面版拥有集成开发工具Qt Creator,方便进行Qt程序的设计,默认配置用于开发桌面程序,进行交叉编译设置(有时间待后文详述)后,可以直接编译嵌入式程序。 

        Qt Embedded也称Qt/E,是运行于嵌入式LinuxQt基础类库,目前最高版本为4.8(不确定)。它的图形界面直接工作于Frame Buffer上,绕过了窗口管理系统,具有较高的效率,适于嵌入式环境。 

        Qtopia是一个嵌入式桌面环境,以Qt Embedded(在某些版本中称Qtopia Core)为基础,在后期改名为Qt Extended。它提拥有一个桌面,并供了手机/PDA中常用的基本功能软件(如电话本等等),在4.4.3后官方停止开发(或改由开源社区维护)。 

        不同的开发目标应当选择不同的开发工具和环境,如果读者不开发桌面程序,也不需要Qt Creator(自己写makefile),可以不用安装桌面版,但装上对后续配置还是有一定方便作用的。 

    对嵌入式开发者来说,如果仅仅开发单独的图形界面程序,不需要嵌入式桌面的话,只使用Qt/E即可,没必要使用过时的Qtopia 

        友善之臂开发板默认的Qtopia环境是2.2,已经与4.xQt/E库不兼容,除了演示自带程序外,对开发而言几乎不堪用。开发板还提供了Qt Extended 4.4.3,但这个环境提供的是一个诺基亚功能机的界面,基本上也只能供学习研究使用了。所以建议读者,如果不是有直接针对Qtopia的开发需求,学习内容以Qt/E为主比较好,嵌入式桌面开发,不如交给Android去做。 

        同样是开发图形界面程序,QtAndroid两种工具各有千秋。Android的优点是界面比较适合手机等移动终端的操作习惯,虚拟机对底层环境隔离比较充分,程序开发运行不用考虑各种不同的硬件和操作系统版本,不需要麻烦的配置,同时对Android原生支持的硬件(比如GPS)开发也比较容易。对一般应用程序开发而言,Android省力省心。但Android体积比较庞大,对系统要求较高,不少低端开发板跑起来非常吃力。Qt则正好相反,图形界面倾向于PC风格,与操作系统结合比较紧密,方便访问和管理众多设备,对系统要求较低。比如读写串口在Qt中轻而易举,使用Android开发就要用NDK库辅助,配置开发反而相当艰深。所以可以说Android是面向特殊的嵌入式环境——手机的专业快速开发工具,而Qt则是面向一般(复杂)嵌入式环境的通用工具。如果开发中不大与硬件打交道,可能Android更合适,反之不如选择Qt 

        附带说一句,现在Qt也有了for Android的版本,不过笔者以它适用于两类人:一类是拥有大把Qt代码想在Android环境中用,另一类是想用Android但不会也不想学JavaAndroid API。如果不是上述两类,笔者以为就基本上没必要研究这种非驴非马的东西。 

二、准备工作 

    注意要在32Ubuntu系统中进行配置,由于版本冲突多如牛毛,不要尝试64位系统。Qt开发环境需要不少工具包作为基础,有些可能是系统自带的,也有些可能是笔者先前配置系统时顺带安装的,读者可以参考推荐阅读中的系统配置过程。 

    可通过以下链接下载安装包或源码包,或从友善之臂提供的资料光盘中查找(SDKx86-qte包中,不过版本为2010.01): 

          arm-linux-gcc-4.5.1-v6-vfp-20101103.tgzARM交叉编译器) 

          arm-qte-4.7.0-20101105.tar.gzARM上的Qt/E库) 

          x86-qte-4.6.1-20100201.tar.gzPC上运行的Qt/E模拟器) 

          arm-qt-extended-4.4.3-20101105.tgzARM上运行的Qtopia 

          x86-qt-extended-4.4.3-20101003.tgzPC上运行的Qtopia模拟器) 

          qt-sdk-linux-x86-opensource-2010.05.1.binQt SDK开发环境) 

        x86版本的Qt用于在PC上仿真运行为ARM开发的Qt程序,需要虚拟framebuffer工具qvfb,而这个工具的源码正好由SDK提供了。 

        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

    为编译Qt还要安装图形和视频开发包: 

    sudo apt-get install xorg-dev

    sudo apt-get install libv4l-dev

    安装后一个包时,会报告依赖关系错误,在Ubuntu软件中心中搜索libv4lconvert0libv4l-0卸载(先卸哪个都一样,两个会被一起卸载)后再运行上条命令。不要用apt卸载,它会要求同时卸掉几十个包。 

    若不安装上述第一个包,会出现错误: 

        X11/extensions/XTest.hNo 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

    如果以前做过编译内核或其他开发配置工作,系统可能已经自带了一套Qt工具集,与本文配置对象不兼容(很多人就是卡在这里了),应当删除: 

    sudo rm /usr/bin/qmake

    sudo rm /usr/bin/qmake-qt4

    否则编译Qtopia时会出现错误: 

        Bootstrap QBuild: .. FAIL

    网上很多介绍删除Qt Creator可以解决,其实是错的。 

    根据Qt安装提示,还应该检查以下包是否安装: 

        libglib2.0-dev

        libSM-dev

        libxrender-dev

        libfontconfig1-dev

        libxext-dev

        libgl-mesa-dev

        libglu-mesa-dev 

    在Ubuntu 12.04中,除第一个外,其他包应该都是最新版,第一个包因依赖关系冲突无法安装,好在不影响编译和运行。 

    注意:在拷贝粘贴命令时,其中某些字符可能被不同的编辑环境改变,特别是空格和符号,如命令执行出错,可以考虑在Linux命令行下删除空格和符号后手工输入一次。 

三、安装与编译 

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-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头文件和库文件路径(/xxxtslib安装目录)。这里的编译过程非常诡异,笔者至今也未明所以然,只能指出如下几点供读者参考: 

    如不能正确设置tslib路径,将出现如下错误提示: 

        The tslib functionality test failed!

        You might need to modify the include and library search paths by editing

        QMAKE_INCDIR and QMAKE_LIBDIR in

        /源码包解压目录/qt-everywhere-opensource-src-4.7.2/mkspecs/qws/linux-arm-g++. 

    正常解决办法是进入错误提示中的路径,编辑文件qmake.conf加入两行: 

    QMAKE_INCDIR = /xxx/include

    QMAKE_LIBDIR = /xxx/lib

    但诡异错误既出,正常办法多半是无效的,编辑文件后错误依旧。也有人建议改上述文件中的编译器名,但据笔者分析这种方法无道理(篇幅有限不赘),事实也未成功。直接在-qt-mouse-tslib参数后增加-I-L两项也尝试了,同样无效。 

    最后在偶然中改变了友善之臂脚本中configure命令参数的顺序,,改成本文这个样子,然后删除又输入了几个空格,编译就奇迹般的通过了。后来再试,拷贝的命令都不能成功,建议读者也改改空格碰碰运气。 

        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)

然后将下列命令保存为脚本执行: 

cd ~/x86-qt-extended-4.4.3

    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文件中。 

错误:

In file included from ../../include/QtGui/private/qcups_p.h:1:0,

                 from /home/gaosheng/x86-qt-extended-4.4.3/qt-extended-4.4.3/qtopiacore/qt/src/gui/painting/qpdf.cpp:42:

/home/gaosheng/x86-qt-extended-4.4.3/qt-extended-4.4.3/qtopiacore/qt/src/gui/painting/qcups_p.h:74:11: error: 'ppd_file_t' does not name a type

解决:

~/x86-qt-extended-4.4.3/qt-extended-4.4.3/qtopiacore/qt/src/gui/painting/qcups_p.h中加入#include <cups/ppd.h>

#ifndef QT_NO_CUPS

#include <QtCore/qlibrary.h>

#include <cups/cups.h>

#include <cups/ppd.h>                ----加上这一行

重新执行上述脚本。

 

编译成功后,还要从~/qtsdk-2010.05/qt/bin目录下拷贝qvfb文件到/opt/QtEmbedded-4.4.3-i386/sdk/qtopiacore/host/bin目录下。

7. 编译arm-qtopia-4.4.3

cd ~

tar xvzf arm-qt-extended-4.4.3-20101105.tgz

cd arm-qt-extended-4.4.3

        arm-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/目录下,方便以后使用。

发生问题及解决办法似上:

vi ~/arm-qt-extended-4.4.3/qt-extended-4.4.3/qtopiacore/qt/src/gui/painting/qcups_p.h

#include <cups/ppd.h>

 

四、测试编译结果 

启动~/qtsdk-2010.05/qt/bin目录下的qfvb程序,然后进入/usr/local/Trolltech/QtEmbedded-4.6.1-i386/demos目录,任选一个子目录下的可执行文件,加-qws参数在命令行下执行,如执行成功则说明x86-qte编译成功。 

 

测试的例子:

cd ~/qtsdk-2010.05/qt/bin

./qvfb &

/usr/local/Trolltech/QtEmbedded-4.6.1-i386/demos/affine/affine -qws

    再如:

cd ~/qtsdk-2010.05/qt/bin

./qvfb &

/usr/local/Trolltech/QtEmbedded-4.6.1-i386/demos/books/books -qws

 

要测试x86-qtopia,进入/opt/QtEmbedded-4.4.3-i386目录,执行: 

    ./bin/runqtopia

    将显示出一个诺基亚手机界面。