目录
一、文档简介:
本文档用于介绍Loongson 1B开发板上移植QT-4以及相关运行环境的搭建。
开发环境参数:
操作系统:Ubuntu 11.04
本机平台:X86
目标平台:Loongson 1B 开发板
交叉编译工具链:gcc-3.4.6-2f(1B交叉编译工具链)
所需软件及工具包:
QT源码包:qt-everywhere-opensource-src-4.7.1.tar.gz
TSLIB源码包:tslib-1.4.tar.gz
二、移植过程
1.安装交叉编译工具链
首先安装Loongson 1B开发板提供的交叉编译工具链:
解压gcc-3.4.6-2f.tar.gz。PS.有些工具链对目录有一定的要求,请询问交叉编译工具链提供者,gcc-3.4.6-2f 需要放在/home/cpu/目录下面。
#tar zxvf gcc-3.4.6-2f.tar.gz
#mv gcc-3.4.6-2f /home/cpu/
将工具链加入到PATH环境变量中:
#export PATH=/home/cpu/gcc-3.4.6-2f/bin:$PATH
PS.每一次需要交叉编译均需要将交叉编译工具链加入到PATH变量,可通过修改/etc/profile文件来实现默认添加,即将上边最后一条语句加入到该文件中即可。
2.交叉编译TSLIB工具
解压tslib-1.4.tar.gz,进入文件夹交叉编译TSLIB工具,并指定工具安装目录为/TSLIB:
# tar zxvf tslib-1.4.tar.gz
# cd tslib-1.4
# ./autogen.sh
#./configure --host=mipsel-linux ac_cv_func_malloc_0_nonnull=yes
--prefix=/TSLIB
# make
# make install
编译完成后,TSLIB目录需包含以下文件目录:
# ls /TSLIB
bin etc include lib
各个目录分别为TSLIB的校准及测试程序、环境配置文件、头文件、动态库。
根据1B开发板触摸屏驱动类型,配置TSLIB,修改TSLIB的环境配置文件:修改/TSLIB/etc/ts.conf,将# module_raw input改成module_raw input,即去掉前面的注释符。PS.这里需要注意的是module_raw input前面不允许有空格。
3.交叉编译QT-4
首先解压QT-4.7.1源码包并重命名后进入改目录以配置环境变量:
# tar zxvf qt-everywhere-opensource-src-4.7.1.tar.gz
#mv qt-everywhere-opensource-src-4.7.1/ qt-embedded-free-4.7.1-tslib-test/
# cd qt-embedded-free-4.7.1-tslib-test/
# export QTDIR=$PWD
# export QTEDIR=$PWD
# export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
# export PATH=$QTDIR/bin:$PATH
执行以上步骤即可配置好QT的编译环境变量。
接下来需要修改相关的QT编译参数:
# vim mkspecs/qws/linux-mips-g++/qmake.conf
确保文件中指定的交叉编译参数为gcc-3.4.6-2f 交叉编译工具链中对应gcc名称,并制定平台指令集。主要修改以下标记为yellow的参数:
File:mkspecs/qws/linux-mips-g++/qmake.conf |
# # qmake configuration for building with mipsel-linux-g++ # include(../../common/g++.conf) include(../../common/linux.conf) include(../../common/qws.conf) # modifications to g++.conf QMAKE_CC = mipsel-linux-gcc QMAKE_CXX = mipsel-linux-g++ QMAKE_CFLAGS += -mips32 QMAKE_CXXFLAGS += -mips32 QMAKE_LINK = mipsel-linux-g++ QMAKE_LINK_SHLIB = mipsel-linux-g++ # modifications to linux.conf QMAKE_AR = mipsel-linux-ar cqs QMAKE_OBJCOPY = mipsel-linux-objcopy QMAKE_STRIP = mipsel-linux-strip load(qt_config) |
QT-4对于TSLIB触摸屏的支持相对QT-3来说就简单很多了,不需要对QT的源码进行修改,仅需要在configure时指定TSLIB参数即可,接下来开始进行QT-4的交叉编译过程:
#./configure -release -shared -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-mips-g++ -embedded mips -qt-freetype -depths 8,16,24,32 -qt-gfx-linuxfb -no-gfx-transformed -no-gfx-multiscreen -no-gfx-vnc -no-gfx-qvfb -no-glib -qt-mouse-tslib -I/TSLIB/include -L/TSLIB/lib -prefix /usr/local/Trolltech/QtEmbedded-4.7.1-mips/
#make
#make install
可在/usr/local/Trolltech/QtEmbedded-4.7.1-mips/目录查看到编译生成文件。
编译过程可能遇到的问题:
提示找不到头文件、函数未定义或者提示/usr/bin/ld: cannot find -lxxx,其中xxx即表示函式库文件名称,其命名规则是:lib+库名(即xxx)+.so,会发生这样的原因有以下三种情形:
1.系统没有安装相对应的lib
2.相对应的lib版本不对
3.lib(.so)的symbolic link 不正确,没有连结到正确的函式库文件(.so)
解决方法:
(1)先判断在/usr/lib 下的相对应的函式库文件(.so) 的symbolic link 是否正确,若不正确改成正确的连结目标即可解决问题。
(2)若不是symbolic link 的问题引起,而是系统缺少相对应的lib安装lib即可解决。
(3)如何安装缺少的lib:先搜寻相对应的LIB再进行安装
#apt-cache search libxxx-dev
#apt-get install libxxx-dev
若搜索到相关项,执行安装即可,若搜索不到,可上网搜索相关内容,此种错误一般很容易在网上找到解决方法。
4. configure参数选项以及QT库裁剪
4.1 configure参数分类
在QT的源码包目录中执行以下指令可查看configure的详细参数:
#./configure --help
Usage: configure [-h] [-prefix <dir>] [-prefix-install] [-bindir <dir>] [-libdir <dir>]
[-docdir <dir>] [-headerdir <dir>] [-plugindir <dir> ] [-datadir <dir>]
[-translationdir <dir>] [-sysconfdir <dir>] [-examplesdir <dir>]
[-demosdir <dir>] [-buildkey <key>]
以下是QT的基本参数:
[-release] [-debug][-debug-and-release] [-developer-build]
[-shared] [-static] [-no-fast] [-fast] [-no-largefile]
[-largefile] [-no-exceptions] [-exceptions] [-no-accessibility]
[-accessibility] [-no-stl] [-stl] [-no-sql-<driver>] [-sql-<driver>]
[-plugin-sql-<driver>] [-system-sqlite] [-no-qt3support] [-qt3support]
[-platform] [-D <string>] [-I <string>] [-L <string>] [-help]
以下是对QT所支持模块的设置参数:
[-qt-zlib] [-system-zlib] [-no-gif] [-qt-gif] [-no-libtiff] [-qt-libtiff] [-system-libtiff]
[-no-libpng] [-qt-libpng] [-system-libpng] [-no-libmng] [-qt-libmng]
[-system-libmng] [-no-libjpeg] [-qt-libjpeg] [-system-libjpeg] [-make <part>]
[-no-make <part>] [-R <string>] [-l <string>] [-no-rpath] [-rpath] [-continue]
[-verbose] [-v] [-silent] [-no-nis] [-nis] [-no-cups] [-cups] [-no-iconv]
[-iconv] [-no-pch] [-pch] [-no-dbus] [-dbus] [-dbus-linked]
[-no-separate-debug-info]
以下是第三方库的支持参数:
[-no-mmx] [-no-3dnow] [-no-sse] [-no-sse2]
[-qtnamespace <namespace>] [-qtlibinfix <infix>] [-separate-debug-info]
[-armfpa][-no-optimized-qmake] [-optimized-qmake] [-no-xmlpatterns]
[-xmlpatterns][-no-phonon] [-phonon] [-no-phonon-backend]
[-phonon-backend][-no-openssl] [-openssl] [-openssl-linked]
[-no-gtkstyle] [-gtkstyle] [-no-svg] [-svg] [-no-webkit] [-webkit]
[-no-scripttools] [-scripttools]
以下是QT模块安装路径配置参数:
PS.以下选项都是可选,通过他们指定安装目录,不指定则用默认目录。选项前标记*的则为系统默认,+则为添加才有效那种。
-prefix <dir> .......... 指定安装目录默认在 /usr/local/Trolltech/QtEmbedded-4.X.X
-hostprefix [dir] ..... 指定可扩展的工具库安装路径,默认当前目录
* -prefix-install ..... 指定QT的本地安装至/usr/local/Trolltech/QtEmbedded-4.X.X,此选项优先于-PREFIX。
PS.以下选项用来指定分开安装不同部分,比如希望将可执行的放在/usr/bin 将库文件放在/lib下等等:
-bindir <dir> .......... 指定可执行文件路径 <dir>(默认 PREFIX/bin下)
-libdir <dir> ........... 指定库文件路径 <dir>(默认 PREFIX/lib)
-docdir <dir> .......... 指定文档路径 <dir>(默认 PREFIX/doc)
-headerdir <dir> ..... 指定头文件路径 <dir>(默认 PREFIX/include)
-plugindir <dir> ...... 指定插件路径 <dir> (默认 PREFIX/plugins)
-datadir <dir> ........... 指定QT要使用到的一些数据文件所在路径 <dir> (默认 PREFIX)
-translationdir <dir> .. 指定QT程序的翻译文件路径 <dir>(默认 PREFIX/translations)
-sysconfdir <dir> ...... 指定QT的设置文件路径 <dir>(默认 PREFIX/etc/settings)
-examplesdir <dir> ... 指定实例文件, <dir>(默认 PREFIX/examples)
-demosdir <dir> ........ 指定demos的安装路径 <dir> (默认 PREFIX/demos)
以下选项可以匹配自定义插件:
- buildkey <key> ...... 通过指定的key生成QT库和插件。
4.2 configure参数详解
下边将对关键参数进行描述说明:
A. 配置选项:
PS.默认的选项(*),可选添加选项(+)
* -release .............. 加上此选项编译程序QT不会做出优化,往往在开发过程使用此选项,是默认选项
-debug .................... 此选项在编译过程QT会对程序进行优化,在发布软件的时候应该用此选项
-debug-and-release ..编译两个版本
-developer-build..... 编译Qt的开发商和连接选项(包括自动测试出口的Qt)
-opensource............ 以开源版本发布程序
-commercial........... 以商业版本发布程序
* -shared ............... 创建和使用共享Qt库。
-static .................... 创建和使用静态的Qt库。
* -no-fast ............. 使用通常的Makefile来编译,是默认选项
-fast ...................... 快速编译,除了封装必要的库,部分步骤省略或者用快速的方法处理
-no-largefile ......... 禁用大文件支持。
+ -largefile ........... 支持访问大于4GB的文件
* -no-exceptions . 禁用编译器本身对异常的处理
-exceptions ......... ..启用编译器本身对异常的处理
-no-accessibility ..
* -accessibility ... 禁用/启用无障碍支持
-no-stl .................
* -stl ................... 禁用/启用STL支持
-no-sql-<driver> ..禁用SQL
-qt-sql-<driver> ...根据需求启用SQL插件(默认全部关闭)
-plugin-sql-<driver> 禁用/启用/启用插件 对SQL的支持
-system-sqlite ..... 启用支持sqlite也可用-qt-sqlite
-no-qt3support .....
* -qt3support ........ 禁用/启用qt3支持模块
-no-xmlpatterns ....
+ -xmlpatterns ....... 禁用/启用xmlpatterns模块
-no-phonon .........
+ -phonon ............ 禁用/启用Phonon模块(可以理解为声音控制模块)
-no-phonon-backend..
+ -phonon-backend..... 禁用/启用phonon-backend模块
-no-svg ............
+ -svg ............... 禁用/启用svg模块
-no-webkit .........
+ -webkit ............ 禁用/启用webkit模块(访问网络模块)
-no-scripttools ....
+ -scripttools ....... 禁用/启用scripttools模块
-platform target ... .MIPS平台指定模块 (qws/linux-mips-g++)
-no-mmx ............
-no-3dnow .........
-no-sse ...............
-no-sse2 ............. 以上四个分别是取消对mmx、mmx、sse、sse2 指令集的支持
-qtnamespace <name> 指定所有库代码路径.
-qtlibinfix <infix> 重命名所有.so库文件到指定路径
-D <string> ........ 添加一个预处理器
-I <string> ........ 添加一个明确的头文件路径
-L <string> ........ 添加一个明确的库文件路径
-help, -h .......... 显示帮助信息
B. 第三方库选项:
PS.用于个性化定制QT,一般项目需要什么插件就加上进行编译即可。
-qt-zlib ..............
+ -system-zlib .. zlib依赖包
-no-gif .............
* -qt-gif ........... gif图片支持包See also src/plugins/imageformats/gif/qgifhandler.h
-no-libtiff ........
-qt-libtiff ......... tiff支持插件
+ -system-libtiff .... 默认是-system调用系统的,出错的话可以尝试用-qt,qt的在编译过程不容易出错
-no-libpng ........
-qt-libpng ......... png图片支持插件
+ -system-libpng ....
-no-libmng .........
-qt-libmng ......... mng支持插件
+ -system-libmng .....
-no-libjpeg .........
-qt-libjpeg .......... jpeg图片支持插件
+ -system-libjpeg ..
-no-openssl ..........
+ -openssl ............ openssl支持插件
-openssl-linked ....
-ptmalloc .......... 系统内存分配器
C. 扩展选项:
PS.扩展选项,模块的选择等,使编译更加人性化。
-make <part> ........ 选择是否编译某些无关紧要的子模块
-nomake <part> .....(例如不想编译系统自导的demos则可使用-nomake demos)
-R <string> ........... 添加一个动态库
-l <string> ............ 添加一个静态库
-no-rpath ...............
+ -rpath ................ 是否将生成的库安装在软件的安装目录,默认是在安装目录,否则自己指定路径
-continue .............. 忽略错误一路前奔的编译,因为一般情况是按照模块逐个编译碰到错误就停止。加上此参数是全部编译最后处理
-verbose, -v ......... 显示每个步骤的详细信息
-silent ................. 安静的编译省略信息回显
* -no-optimized-qmake ...
-optimized-qmake ...... 禁用/开启qmake的优化作用
-no-nis ............
* -nis ............... 禁用/开启NIS的支持
-no-cups ...........
* -cups .............. 禁用/开启对CUPS的支持,需要 cups/cups.h and libcups.so.2
-no-iconv ..........
* -iconv ............. 禁用/开启对iconv的支持.
-no-pch ............
* -pch ............... 禁用/开启是否使用预处理器头文件
-no-dbus ...........
+ -dbus .............. 禁用/开启对QTdbus模块的编译
-dbus-linked .......
-reduce-relocations ..... 减少因为链接优化而导致的而外的库文件重置
-no-separate-debug-info . 不将调试信息放在一个文件内
* -separate-debug-info .... 将调试信息放在一个文件内
D. 嵌入式 QTE编译选项:
-xplatform target ...........交叉编译过程指定目标平台
例如MIPS平台指定模块(qws/linux-mips-g++)
-no-feature-<feature> ...不编译<feature>.
-feature-<feature> ...... 编译<feature> 可选feature在src/corelib/global/qfeatures.txt文件内可查寻
-embedded <arch> ..... 指定嵌入式平台的类型例如:arm mips x86 generic
-armfpa .......................
-no-armfpa ................. 禁用/启用armfpa浮点格式支持
-little-endian .......... 指定字节顺序为小字节序、低字节序
-big-endian ............ 指定字节顺序为大字节序、高字节序
-host-little-endian . ..指定主机平台字节顺序为小字节序、低字节序
-host-big-endian ..... 指定主机平台字节顺序为大字节序、高字节序
注:只需指定目标平台的字节顺序,否则将会选用主机的字节顺序
-no-freetype ........
-qt-freetype ........ 禁用/启用对freetype 模块的支持
* -system-freetype ....
-qconfig local ..... 在默认配置的情况下系统使用src/corelib/global/qconfig-local.h
-depths <list> ..... 支持显示设备的位深度。有1, 4, 8, 12, 15, 16, 18, 24, 32 and 'all'
-qt-decoration-<style> ....指定编译后的界面风格默认是windows
-plugin-decoration-<style> 指定插件风格默认windows
-no-decoration-<style> ....不知定风格采用默认选项
-no-opengl ..........
-opengl <api> ....... 禁用/开启对opengl的支持
注意:使用此选项的前提条件是硬件支持且可以驱动
-qt-gfx-<driver> ... 指定显示设备驱动库
参考选项为:[ linuxfb transformed qvfb vnc multiscreen ]
-plugin-gfx-<driver> 指定显示插件驱动库
参考选项为:[ ahi directfb hybrid linuxfb powervr qvfb transformed vnc ]
-no-gfx-<driver> ... 不加载显示设备
参考选项为: [ linuxfb transformed qvfb vnc multiscreen ]
-qt-kbd-<driver> ... 指定图形界面下的键盘驱动库
参考选项为: [ tty usb sl5000 yopy vr41xx qvfb ]
-plugin-kbd-<driver> E指定图形界面下键盘插件驱动库
参考选项为: [ linuxis sl5000 usb vr41xx yopy ]
-no-kbd-<driver> ... 不加载指定驱动
参考选项为: [ tty usb sl5000 yopy vr41xx qvfb ]
-qt-mouse-<driver> ... 指定图形界面下鼠标驱动库
参考选项为: [ pc bus linuxtp yopy vr41xx tslib(触摸屏选这个) qvfb ]
-plugin-mouse-<driver> 鼠标插件驱动库
参考选项为: [ bus linuxis linuxtp pc tslib vr41xx yopy ]
-no-mouse-<driver> ... 指定不加载的鼠标驱动库模块
参考选项为: [ pc bus linuxtp yopy vr41xx tslib qvfb ]
-iwmmxt ............ 编译使用iwmmxt指令集,方便对某些XScale CPUs的支持
-no-glib ...........
+ -glib .............. 禁用/启用对glib的支持
4.3 QT库裁剪
首先我们看看前边编译成功的QT-4的库的大小:
# du -sh *.so.4.7.1
3.5M libQtCore.so.4.7.1
4.1M libQtDeclarative.so.4.7.1
13M libQtGui.so.4.7.1
124K libQtMultimedia.so.4.7.1
1.2M libQtNetwork.so.4.7.1
2.8M libQtScript.so.4.7.1
980K libQtScriptTools.so.4.7.1
824K libQtSql.so.4.7.1
168K libQtTest.so.4.7.1
324K libQtXml.so.4.7.1
对于一个基本的QT程序,libQtGui以及libQtCore这两个基本库是必须的,也就是即便是运行一个最简单的HelloWorld 程序,也至少需要占据16.5M大小的存储空间,这对于有限的嵌入式板子资源来说是一个极大的浪费,最好的方法是进行个性化定制QT开发包,通过裁剪QT库来减少板上资源浪费,同时也有利于提高QT程序在板上的运行速度,具体方法如下:
A.通过configure参数对编译树进行简单裁剪:
Qt-4开始采用了模块化的形式,将独立的功能封装在独立的库里,所以可以很简单的去掉一些不需要的库,这样也能节省编译时间和对硬盘空间的占用。 Qt的configure配置提供了一些设置模块的方法,参考上边的configure参数详解部分,编译之前确定哪些功能是不必要的,我们可以通过configure的时候加这些选项就可以加上或者去掉相应模块的支持。例如在configure参数中加入-no-phonon、-no-webkit、-no-qt3support,即可裁剪掉多媒体控制模块、访问网络模块、QT3兼容模块等,下边提供一个成功编译的configure的设置例子:
./configure -release -shared -fast -no-largefile -no-exceptions -no-accessibility -no-stl -no-sql-sqlite -no-qt3support -no-xmlpatterns -no-multimedia -no-audio-backend -no-phonon -no-phonon-backend -no-svg -no-webkit -no-javascript-jit -no-script -no-scripttools -no-declarative -no-declarative-debug -no-mmx -no-3dnow -no-sse -no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 -no-avx -no-gif -no-libtiff -qt-libjpeg -no-openssl -make libs -nomake tools -nomake examples -nomake docs -nomake demo -no-nis -no-cups -no-iconv -no-dbus -no-openssl -xplatform qws/linux-mips-g++ -embedded mips -no-iconv -no-gtkstyle -no-nas-sound -no-opengl -no-openvg -no-sm -no-xshape -no-xvideo -no-xsync -no-xinerama -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-mitshm -no-xinput -no-xkb -no-glib -qt-freetype -depths 8,16,24,32 -qt-gfx-linuxfb -no-gfx-transformed -no-gfx-multiscreen -no-gfx-vnc -no-gfx-qvfb -no-glib -no-declarative-debug
编译完成后再查看QT库的大小:
# du -sh *.so.4.7.1
3.5M lib/libQtCore.so.4.7.1
13M lib/libQtGui.so.4.7.1
1.2M lib/libQtNetwork.so.4.7.1
272K lib/libQtSql.so.4.7.1
168K lib/libQtTest.so.4.7.1
324K lib/libQtXml.so.4.7.1
可以发现基本库大小并未有多少裁剪,但是相应的模块减少了。由此可以知道通过configure设置参数裁剪可以裁剪模块,通过裁剪模块可以减少编译时间,同时减少部分非必须模块导致的编译错误,但是无法改变一些固有的基本模块,那么我们若需要进一步裁剪,则需要通过以下方式。
B.通过QT提供的qconfig工具进行对模块定制:
Qt的嵌入式版本支持feature裁剪,我们可以充分利用这一特性让对Qt模块进行定制。具体的做法是要做一个自己的qconfig-xxx.h特性文件,该文件中定义你要定制Qt中的哪些feature。在configure的时候加“-qconfig xxx”选项, Qt就会根据你给出的配置文件来编译,以达到裁剪的目的。QT默认不裁剪任何feature。所有Qt预定义好的qconfig文件,可以在src/corelib/global/下找到,包括qconfig-minimal.h, qconfig-small.h, qconfig.medium.h,qconfig-large.h和qconfig-dist.h,也就是从裁剪量由多到少都有据可依。如果要添加你自己的配置文件,要在src/corelib/global下建立一个形如qconfig-xxx.h的文件,这里的xxx也就是你要在configure的时候传入的qconfig参数。
Qt里还提供了一个可视化的配置依赖的工具——qconfig,该工具的源码包在$QTDIR/tools/qconfig目录。需要我们自己手动编译,需要注意的是该工具需要基于开发环境的Qt桌面版本编译,不需要进行交叉编译:
首先在本机的Ubuntu系统中安装QT-4:
# apt-get install libqt4-dev qt4-dev-tools libqt4-gui
安装完成后重新打开新的终端,目的是为了清除之前加入的QT环境变量,然后进入QT的源码包,然后执行以下命令:
# cd tools/qconfig
# /usr/share/qt4/bin/qmake -project
# /usr/share/qt4/bin/qmake
# make
编译完成后,在当前目录生成一个qconfig的可执行程序。
# ./qconfig
然后选择QT-4源码包路径下的src/corelib/global/目录中的qfeatures.txt文件,如下图所示
然后展开各个选项,得到如下图所示可视化选择界面:
通过勾选每个模块中的选项,即可对各个模块进行个性化配置。需要注意的是通过单击选项可以在右边区域看到模块详细信息,其中列出了所属模块信息以及依赖,即不同模块之间所存在依赖关系,若将某些我们需要的模块所依赖的其他模块裁剪掉了,则在编译过程中会报错。
定制好相关模块的选项后,点击File->Save As,选择源码包中的src/corelib/global/目录,填上自定义File name,例如qconfig-example.h,点击保存,即可生成所需的配置文件。
下边提供一个编译通过的qconfig-example.h文件:
File:src/corelib/global/qconfig-example.h |
/* D-Bus */ #ifndef QT_NO_DBUS # define QT_NO_DBUS #endif /* Dialogs */ #ifndef QT_NO_COLORDIALOG # define QT_NO_COLORDIALOG #endif #ifndef QT_NO_ERRORMESSAGE # define QT_NO_ERRORMESSAGE #endif #ifndef QT_NO_FILEDIALOG # define QT_NO_FILEDIALOG #endif #ifndef QT_NO_PRINTDIALOG # define QT_NO_PRINTDIALOG #endif #ifndef QT_NO_WIZARD # define QT_NO_WIZARD #endif /* Images */ #ifndef QT_NO_IMAGEFORMAT_BMP # define QT_NO_IMAGEFORMAT_BMP #endif #ifndef QT_NO_IMAGEFORMAT_PPM # define QT_NO_IMAGEFORMAT_PPM #endif #ifndef QT_NO_IMAGEFORMAT_XBM # define QT_NO_IMAGEFORMAT_XBM #endif #ifndef QT_NO_IMAGEFORMAT_XPM # define QT_NO_IMAGEFORMAT_XPM #endif #ifndef QT_NO_MOVIE # define QT_NO_MOVIE #endif /* ItemViews */ #ifndef QT_NO_DATAWIDGETMAPPER # define QT_NO_DATAWIDGETMAPPER #endif #ifndef QT_NO_LISTVIEW # define QT_NO_LISTVIEW #endif #ifndef QT_NO_PROXYMODEL # define QT_NO_PROXYMODEL #endif #ifndef QT_NO_STANDARDITEMMODEL # define QT_NO_STANDARDITEMMODEL #endif #ifndef QT_NO_TABLEVIEW # define QT_NO_TABLEVIEW #endif #ifndef QT_NO_TREEVIEW # define QT_NO_TREEVIEW #endif /* Kernel */ #ifndef QT_NO_TEXTHTMLPARSER # define QT_NO_TEXTHTMLPARSER #endif #ifndef QT_NO_XMLSTREAM # define QT_NO_XMLSTREAM #endif /* Networking */ #ifndef QT_NO_BEARERMANAGEMENT # define QT_NO_BEARERMANAGEMENT #endif #ifndef QT_NO_COP # define QT_NO_COP #endif #ifndef QT_NO_HOSTINFO # define QT_NO_HOSTINFO #endif #ifndef QT_NO_NETWORKDISKCACHE # define QT_NO_NETWORKDISKCACHE #endif #ifndef QT_NO_NETWORKINTERFACE # define QT_NO_NETWORKINTERFACE #endif #ifndef QT_NO_NETWORKPROXY # define QT_NO_NETWORKPROXY #endif #ifndef QT_NO_UDPSOCKET # define QT_NO_UDPSOCKET #endif #ifndef QT_NO_URLINFO # define QT_NO_URLINFO #endif /* Painting */ #ifndef QT_NO_PRINTER # define QT_NO_PRINTER #endif #ifndef QT_NO_CUPS # define QT_NO_CUPS #endif /* Phonon */ #ifndef QT_NO_PHONON_ABSTRACTMEDIASTREAM # define QT_NO_PHONON_ABSTRACTMEDIASTREAM #endif #ifndef QT_NO_PHONON_AUDIOCAPTURE # define QT_NO_PHONON_AUDIOCAPTURE #endif #ifndef QT_NO_PHONON_EFFECT # define QT_NO_PHONON_EFFECT #endif #ifndef QT_NO_PHONON_MEDIACONTROLLER # define QT_NO_PHONON_MEDIACONTROLLER #endif #ifndef QT_NO_PHONON_OBJECTDESCRIPTIONMODEL # define QT_NO_PHONON_OBJECTDESCRIPTIONMODEL #endif #ifndef QT_NO_PHONON_PLATFORMPLUGIN # define QT_NO_PHONON_PLATFORMPLUGIN #endif #ifndef QT_NO_PHONON_SEEKSLIDER # define QT_NO_PHONON_SEEKSLIDER #endif #ifndef QT_NO_PHONON_SETTINGSGROUP # define QT_NO_PHONON_SETTINGSGROUP #endif #ifndef QT_NO_PHONON_VIDEO # define QT_NO_PHONON_VIDEO #endif #ifndef QT_NO_PHONON_VOLUMESLIDER # define QT_NO_PHONON_VOLUMESLIDER #endif /* Styles */ #ifndef QT_NO_STYLE_MOTIF # define QT_NO_STYLE_MOTIF #endif #ifndef QT_NO_STYLE_WINDOWSXP # define QT_NO_STYLE_WINDOWSXP #endif /* Utilities */ #ifndef QT_NO_ANIMATION # define QT_NO_ANIMATION #endif #ifndef QT_NO_DESKTOPSERVICES # define QT_NO_DESKTOPSERVICES #endif #ifndef QT_NO_GESTURES # define QT_NO_GESTURES #endif #ifndef QT_NO_STATEMACHINE # define QT_NO_STATEMACHINE #endif #ifndef QT_NO_SYSTEMTRAYICON # define QT_NO_SYSTEMTRAYICON #endif #ifndef QT_NO_UNDOCOMMAND # define QT_NO_UNDOCOMMAND #endif /* Widgets */ #ifndef QT_NO_GROUPBOX # define QT_NO_GROUPBOX #endif #ifndef QT_NO_LCDNUMBER # define QT_NO_LCDNUMBER #endif #ifndef QT_NO_CONTEXTMENU # define QT_NO_CONTEXTMENU #endif #ifndef QT_NO_DOCKWIDGET # define QT_NO_DOCKWIDGET #endif #ifndef QT_NO_TOOLBAR # define QT_NO_TOOLBAR #endif #ifndef QT_NO_MENUBAR # define QT_NO_MENUBAR #endif #ifndef QT_NO_RUBBERBAND # define QT_NO_RUBBERBAND #endif #ifndef QT_NO_SLIDER # define QT_NO_SLIDER #endif #ifndef QT_NO_GRAPHICSVIEW # define QT_NO_GRAPHICSVIEW #endif #ifndef QT_NO_SPINWIDGET # define QT_NO_SPINWIDGET #endif #ifndef QT_NO_SPLASHSCREEN # define QT_NO_SPLASHSCREEN #endif #ifndef QT_NO_STACKEDWIDGET # define QT_NO_STACKEDWIDGET #endif #ifndef QT_NO_STATUSBAR # define QT_NO_STATUSBAR #endif #ifndef QT_NO_STATUSTIP # define QT_NO_STATUSTIP #endif #ifndef QT_NO_TOOLBUTTON # define QT_NO_TOOLBUTTON #endif #ifndef QT_NO_WHATSTHIS # define QT_NO_WHATSTHIS #endif #ifndef QT_NO_TOOLTIP # define QT_NO_TOOLTIP #endif #ifndef QT_NO_VALIDATOR # define QT_NO_VALIDATOR #endif |
然后执行以下命令进行编译:
# ./configure -release -shared -fast -no-largefile -no-exceptions -no-accessibility -no-stl -no-sql-sqlite -no-qt3support -no-xmlpatterns -no-multimedia -no-audio-backend -no-phonon -no-phonon-backend -no-svg -no-webkit -no-javascript-jit -no-script -no-scripttools -no-declarative -no-declarative-debug -no-mmx -no-3dnow -no-sse -no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 -no-avx -no-gif -no-libtiff -qt-libjpeg -no-openssl -make libs -nomake tools -nomake examples -nomake docs -nomake demo -no-nis -no-cups -no-iconv -no-dbus -no-openssl -xplatform qws/linux-mips-g++ -embedded mips -no-iconv -no-gtkstyle -no-nas-sound -no-opengl -no-openvg -no-sm -no-xshape -no-xvideo -no-xsync -no-xinerama -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-mitshm -no-xinput -no-xkb -no-glib -qt-freetype -depths 8,16,24,32 -qt-gfx-linuxfb -no-gfx-transformed -no-gfx-multiscreen -no-gfx-vnc -no-gfx-qvfb -no-glib -no-declarative-debug -qconfig example
# make
# make install
安装编译完成后再次查看库的大小:
# du -sh /usr/local/Trolltech/QtEmbedded-4.7.1-mips/lib/*.so.4.7.1
3.1M /usr/local/Trolltech/QtEmbedded-4.7.1-mips/lib/libQtCore.so.4.7.1
6.4M /usr/local/Trolltech/QtEmbedded-4.7.1-mips/lib/libQtGui.so.4.7.1
512K /usr/local/Trolltech/QtEmbedded-4.7.1-mips/lib/libQtNetwork.so.4.7.1
272K /usr/local/Trolltech/QtEmbedded-4.7.1-mips/lib/libQtSql.so.4.7.1
168K /usr/local/Trolltech/QtEmbedded-4.7.1-mips/lib/libQtTest.so.4.7.1
324K /usr/local/Trolltech/QtEmbedded-4.7.1-mips/lib/libQtXml.so.4.7.1
可以看到裁剪是有效的,其中libQtGui裁剪了近半的空间。
5.QT程序移植及运行环境配置
下边将以QT自带example为例讲述移植过程:
在编译之前,需要先制定好编译的QT环境变量,为了方便使用,建议使用脚本进行配置,在程序源文件目录中新建一个qte4-path.sh的文件,内容如下:
File:./qte4-path.sh |
export QTDIR=/usr/local/Trolltech/QtEmbedded-4.7.1-mips/ export QTEDIR=$QTDIR export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH export LD_LIBRARY_PATH=/TSLIB/lib:$LD_LIBRARY_PATH export PATH=/home/cpu/gcc-3.4.6-2f/bin:$PATH |
然后执行以下命令:
#chmod a+x qte4-path.sh
#source qte4-path.sh
#cd examples/widgets/calculator
#$QTDIR/bin/qmake -project
#$QTDIR/bin/qmake
#make
编译成功后可在目录下找到生成的二进制可执行文件calculator,查看该二进制可执行文件相关链接库信息:
# mipsel-linux-readelf -d calculator
Dynamic section at offset 0x15c contains 33 entries:
标记 类型 名称/值
0x00000001 (NEEDED) 共享库:[libQtGui.so.4]
0x00000001 (NEEDED) 共享库:[libQtNetwork.so.4]
0x00000001 (NEEDED) 共享库:[libQtCore.so.4]
0x00000001 (NEEDED) 共享库:[libpthread.so.0]
0x00000001 (NEEDED) 共享库:[libstdc++.so.6]
0x00000001 (NEEDED) 共享库:[libm.so.6]
0x00000001 (NEEDED) 共享库:[libgcc_s.so.1]
0x00000001 (NEEDED) 共享库:[libc.so.6]
0x0000000f (RPATH) Library rpath: [/usr/local/Trolltech/QtEmbedded-4.7.1-mips/lib]
可以看到Library rpath即链接库目录为:
/usr/local/Trolltech/QtEmbedded-4.7.1-mips/lib
还有根据之前安装交叉编译工具链所带的基本库目录为:
/home/cpu/gcc-3.4.6-2f/mipsel-linux/lib/
我们可以在这两个目录下将运行widgets所需要的链接库文件都拷贝出来:
eg.
#cp //usr/local/Trolltech/QtEmbedded-4.7.1-mips/lib/libQtGui.so.4 .
这些*.so文件即为在Loongson 1B开发板上运行QT程序calculator所需要的动态链接库文件。
接下来需要说明一下板上文件系统内QT环境参数设置问题:
上边可以看到QT Library rpath的路径参数为:
/usr/local/Trolltech/QtEmbedded-4.7.1-mips/lib
在开发板上,默认的QT路径即为:
/usr/local/Trolltech/QtEmbedded-4.7.1-mips/
故而我们只需要将运行QT程序需要的相关库文件及相关文件放置在此目录下,板上系统在运行QT程序时即会自动搜索此目录下的相应文件进行加载,该目录下的目录结构一般如下:
/usr/local/Trolltech/QtEmbedded-4.7.1-mips/-->
{
lib/ --> fonts
plugins --> imageformats
translations
}
lib目录用于放置运行QT程序需要的动态库文件,lib目录内的fonts用于放置QT程序需要的字体文件;
plugins用于放置运行QT程序需要加载的插件,一般情况下显示图片需要用到imageformats插件;
translations用于放置QT程序语言国际化支持的翻译文件。
而构建自己的QT文件夹,相关文件需要按照以上QT文件目录结构进行放置。
同时为了TSLIB触摸屏支持,我们需要将之前编译完成的TSLIB文件夹拷贝到板上的文件系统,默认存放位置为编译QT时指定的TSLIB路径。
当然我们也可以通过配置环境变量参数来改变QT目录及TSLIB目录的路径,下边列出板上设置的环境参数设置:
File:/etc/profile |
... #指定QT目录,可更改成自己的QT目录路径 export QTDIR=/usr/local/Trolltech/QtEmbedded-4.7.1-mips #指定中文编码格式,解决中文乱码问题,当然程序中也必须为UTF-8格式编码 export LC_ALL=zh_CN.UTF-8 export LANG_ALL=zh_CN.UTF-8 export LANG=zh_CN.UTF-8 #指定TSLIB目录,可更改成自己的TSLIB目录路径 export TSLIB_ROOT=/TSLIB #指定相关TSLIB运行参数及设备类型 export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0 export TSLIB_TSDEVICE=/dev/event0 export TSLIB_CALIBFILE=/etc/pointercal export TSLIB_CONFFILE=/TSLIB/etc/ts.conf export TSLIB_PLUGINDIR=/TSLIB/lib/ts export TSLIB_TSEVENTTYPE=INPUT #指定QT支持TSLIB触摸屏设备 export QWS_MOUSE_PROTO=Tslib:/dev/event0 #指定QT库及TSLIB库加载路径 export LD_LIBRARY_PATH=$QTDIR/lib:$TSLIB_ROOT/lib:/usr/local/lib:$LD_LIBRARY_PATH #设置QT程序显示参数 export QWS_DISPLAY="LinuxFb:mmWidth100:mmHeight130:0" #指定QT程序加载字体路径 export QT_QWS_FONTDIR=$QTDIR/lib/fonts #指定QT程序加载插件路径 export QT_PLUGIN_PATH=$QTDIR/plugins/ ... |
进行以上配置之后,即可在板子上运行程序,第一次使用TSLIB触摸屏,需要对触摸屏进行校准:
#$ TSLIB_ROOT/bin/ts_calibrate
校准后在/etc目录下会生成一个名为pointercal的校准配置文件
#./calculator -qws
这里需要说明的是:qws的全称是Qt windows system,是QT自行开发的窗口系统,体系结构类似X Windows,是一个C/S结构,由QWS Server在物理设备上显示,由QWS Client实现界面,两者通过socket进行彼此的通讯,而这里后边加的运行参数-qws是指明程序是QWS Server。