移植这个是发现用Qt 4.6 for X86移植到ARM-Linux,理论上移植没太多问题,但实际碰到太多问题,而且QT官网上有针对Embeded Linux 的qt 4.5.3下载。这个资料也全。因此首先用这个版本试试。然后再来移植4.6的版本。

下载
http://get.qt.nokia.com/qt/source/qt-embedded-linux-opensource-src-4.5.3.tar.gz
项目主页
http://doc.trolltech.com/4.5/qt-embedded-linux.html
解压
tar xvzf qt-embedded-linux-opensource-src-4.5.3.tar.gz -C /opt/hxy
cd /opt/hxy/qt-embedded-linux-opensource-src-4.5.3
在编译前最好读下QT的文档
<<Installing Qt for Embedded Linux>>
http://doc.trolltech.com/4.5/qt-embedded-install.html
<<Cross-Compiling Qt for Embedded Linux Applications>>
http://qt.nokia.com/doc/4.5/qt-embedded-crosscompiling.html
1.生成Makefile

Qt4的configure 参数比一般用configure 的项目更加复杂
参考参考文档1 Cross-Compiling Qt for Embedded Linux Applications,这里解释一下.这里有一些跟其它configure不一样的地方,QT所有选项是用-打头,如 -prefix -shared,而且是长选项用--打头,如--help --prefix ,这样很容易写错.

1.1 目标平台 -xplatform 参数

QT使用qmake 产生Makefile,为了让QT在不同平台下编译, QT预先定义一些平台Makefile变量.这一些变量根据编译平台不同,采用不同的值.如QMAKE_CC   在ARM-LINUX下等于arm-linux-gcc.这一些变量都存在名为qmake.conf文件里.当qmake生成Makefile时,将采用这个文件的值.

QT已经针对所有测试过的平台都写相应的qmake.conf.它全部放在QT目录下的mkspecs目录.这是qt 4.5.3的mkspecs下部分目录.

aix-g++        irix-cc-64     macx-xlc        win32-msvc.net
irix-g++       netbsd-g++      wince50standard-armv4i-msvc2005
aix-xlc        solaris-g++   freebsd-g++     wince50standard-mipsiv-msvc2005

其中针对QT窗口系统(QWS)的平台放在 mkspecs/qws下面.这是

freebsd-generic-g++  linux-generic-g++     linux-sharp-g++
linux-arm-g++        linux-generic-g++-32  linux-sh-g++
linux-armv6-g++      linux-ipaq-g++        linux-x86_64-g++
linux-avr32-g++      linux-lsb-g++         linux-x86-g++
linux-cellon-g++     linux-mips-g++        linux-zylonite-g++
linux-dm7000-g++     linux-ppc-g++         macx-generic-g++
linux-dm800-g++      linux-sh4al-g++       solaris-generic-g++
象linux-arm-g++的qmake.conf的内容

#
# qmake configuration for building with arm-linux-g++
#

include(../../common/g++.conf)
include(../../common/linux.conf)
include(../../common/qws.conf)

# modifications to g++.conf
QMAKE_CC                = arm-linux-gcc
QMAKE_CXX               = arm-linux-g++
QMAKE_LINK              = arm-linux-g++
QMAKE_LINK_SHLIB        = arm-linux-g++

# modifications to linux.conf
QMAKE_AR                = arm-linux-ar cqs
QMAKE_OBJCOPY           = arm-linux-objcopy
QMAKE_STRIP             = arm-linux-strip

load(qt_config)

-xplatform 就是告诉configure ,生成qt 4.5.3库的Makefile采用哪一个qmake.conf.
configure -xplatform qws/linux-arm-g++  即表示采用 qws/linux-arm-g++的qmake.conf.而且这个格式很简单,所以如果有一个新的嵌入式平台,你完全可以在qws建个类似qmake.conf..只要用xplatform通知configure 即可。但是目录名必须是 linux-XXXX-g++
这里有一个TI的OMAP-L137的扩展样例
http://wiki.davincidsp.com/index.php/Building_Qt
另外一个样例
http://labs.trolltech.com/blogs/2009/11/20/building-qt-to-make-use-of-the-beagle-boards-sgx-gpu/
-platform 是指明host 工具(即qmake,uic,moc)的编译环境,一般默认是qws/linux-x86-g++
1.2 体系结构相关
-embedded 体系结构参数
QT为了更高的效率和线程安全。QT定义的原子操作,它跟各个平台高度相关。嵌入式平台必须配置这个参数,Configure用-embeded 写入Makefile.比如arm 就是 –embedded arm .
这个参数决定QtCore引用哪一个头文件,象ARM就引用 src/corelib/arch/qatomic_arm.h
-little-endian  字节序选项–big-endian
大部分采用 -little-endian (小端字节序)
1.3 编译配置选项
-shared 编译动态版本
-prefix 编译好Qt库安装目录,默认目录是/usr/local/Trolltech/QtEmbedded-4.6.3 ,这里设为
-prefix /opt/QtEmbedded-4.5.3 (注意没有=)
-D <string> ........增加宏定义
-I <string> ........ 增加外部头文件引用目录
-L <string> ........ 增加外部库路径
1.4 指定QT组件编译
这个指QT库中哪一些不被编译,这一类参数以 --nomake 来指定
  如 –nomake examples –nomake demos ,这个以节约编译时间。
相反的指定哪一部分编译用 –make 如  -make libs
如果QT的扩展库则直接采用名字来指明。
   -no-XXX表示不编译某一些库,  -no-phonon 不编译 phonon库,则对应的 –phonon就编译它。类似参数有。
   [-no-dbus] [-dbus]  [-no-svg] [-svg] [-no-webkit] [-webkit]
1.5 指定哪一些第三方库被引入。
QT作为一个跨平台的函数,必然大量引用第三方库,在嵌入式平台上,必须要有选择指定使用第三方案。
一般有三种情况。
  1).QT已经把大量第三方库源码放在src/3rdparty目录下。用 -qt-XXXX参数指定,如 -qt-libpng 表示用QT自己目录下的libpng源码编译,这种方法比较省心,并且出错可能少。
  2).使用操作系统中已经编译好第三方库,用-system-XXX参数指定,如-system-libjpeg 表示用系统中编译好的libjpeg库,这里需要与 –I,-L两个参数来指定相应头文件和库路径。
  3).不编译,使用-no-XXX来指定 ,如-no-cups,不编译cups打印支持。
1.6 指定常用外部设备的类型
  • -qt-gfx-<driver> ...指明图形设备类形,常见有 –qt-gfx-qvfb (X85 FB虚拟器),-qt-gfx-vnc ,远程桌面。-qt-gfx-linuxfb frameBuffer输出
  • -no-gfx-<driver> 禁止采用这种类型输出 –no-gfx-vnc. -no-gfx-transformed  -no-gfx-multiscreen
  • -qt-kbd-<driver> 指明键盘设备 --qt-kbd-usb USB键盘 –qt-kbd-tty 终端输入
  • -qt-mouse-<driver> ..指明点输入设备,-qt-mouse-pc ,-qt-mouse-tslib 使用TSLIB来控制。 注意QT 5.3.2不支持USB鼠标
  • -plugin-sql-<driver> 这个勉强归于这一类,采用哪一种数据库引擎。-plugin-sql-sqlite.使用sqlite
最终我使用一个编译较全的版本的Makefile,这里的(echo o ; echo yes ) | 相当于人工输入 o\n 和 yes\n,用来代替人工输入
(echo o ; echo yes ) |  ./configure -prefix /opt/QtEmbedded-4.5.3  -shared -xplatform qws/linux-arm-g++  -embedded arm -little-endian -qt-gfx-linuxfb -qt-kbd-usb -qt-mouse-tslib  -qt-zlib -qt-freetype -qt-libtiff -qt-libpng -qt-libmng
2.编译安装
按qt的提示,在QT目录下执行
gmake
经过大约3小时,整个库编译完毕,执行
make install
3.在开发板测试库代码
 我是直接用QtCreator编译自行开发的qplayer。直接编译。
大体有如下步骤
3.1 把QT库发到开发板上(一般用NFS测试)
3.2 写运行QT程�1�7�1�7�1�7脚本
3.3 运行程序
3.1 发布QT库
我的NFS路径是发布在主机 /home/hxy/,
我的tslib发布在通用库路径 /home/hxy/common_lib.参见
http://blog.chinaunix.net/u3/105675/showart_2145447.html
在主机上执行,把qte库拷贝NFS。 
mkdir -p  /home/hxy/qte-4.5.3/lib
  cp -ra /opt/QtEmbedded-4.5.3/lib/* /home/hxy/qte-4.5.3/lib
在开发板上用,把这个路径mount上/mnt/nfs
mount -t nfs -o nolock,intr,rsize=1024,wsize=1024 192.168.1.8:/home/hxy /mnt/nfs
在开发板执行如下,建立与主机同名目录链接,因为QT很多程序要使用原来路径。
ln -s /mnt/nfs/qte-4.5.3 /opt/QtEmbedded-4.5.3
3.2 写QT配置文件
QT程序有两种模式运行程序.
1)加入Qtopia桌面,放入一个图标,点击运行。这要求移植Qtopia。这是下一步工作
2)独立程序。这要求程序自己配置环境.我们采用这模式测试一下。
独立运行需要配置一些环境,我统一写入一个脚本
   1. 如果使用 tslib 。需要配置相关选择
   2.QT本身环境变量
   3. LD_LIBRARY_PATH 指向QT库路径和tslib库路径。

tslib环境含义参见

http://blog.chinaunix.net/u3/105675/showart_2145447.html

QTDIR需要如下变量

export QTDIR=/mnt/nfs/qte-4.5.3 #QTDIR发布目录 
  export QWS_KEYBOARD=USB:/dev/input/event1 #键盘采用USB键盘
  export QWS_MOUSE_PROTO=Tslib:/dev/input/event0 #tslib输入
  export QWS_SIZE=320x240 #LCD分辨率

LD_LIBRARY_PATH 指向QT库路径和tslib库路径
export LD_LIBRARY_PATH=$QTDIR/lib:$TSLIB_ROOT/lib

执行QT应用程序

./qplayer -qws

以下是完整脚本

#tslib 环境变量 -----------------------------
export TSLIB_ROOT=/mnt/nfs/common_lib/output/arm-linux
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_CONSOLEDEVICE=none
 export TSLIB_FBDEVICE=/dev/fb0

export LD_LIBRARY_PATH=$QTDIR/lib:$TSLIB_ROOT/lib
 
 #$TSLIB_ROOT/bin/ts_calibrate 
 #exit
 
 #QT环境变量-------------------
 export QTDIR=/mnt/nfs/qte-4.5.3

export QWS_KEYBOARD=USB:/dev/input/event1
 export QWS_MOUSE_PROTO=Tslib:/dev/input/event0
 export QWS_SIZE=320x240
 
 #执行应用程序----------------------
 ./qplayer -qws &

这是在我的板运行效果,手机拍摄效果不好,但仍然可以看出是桌面版一样效果,因为没有对嵌入式版本做优化。窗口很大,而且汉字显示也不正确,但是按钮的点击反应也正确,能弹出文件打开对话框.

运行注意.网上很多人介绍用gcc 4.3.2编译会有段错误,建议用gcc 4.1.2。我第一次执行也是如此。但用gdb调试发现虽然是用-qt-mouse-tslib,但是仍然需要外部tslib的动态库,否则也是段错误。另外必须要配置好tslib可以正常工作。因此第一步必须把ts_calibrate 能正确执行。才要执行下一步。

另外虽然Makefile使用QT自带的库来编译,但是最终输出并没有输出so.但程序能正常运行这个需要检查一下是为什么。

3.应用程序中文支持
本节功能由我学生刑维振测试成功
3.1 Qte目录lib/fonts下必须有中文字体,一般自带了unifont.
3.2  将应用程序字体用setfont()设为unifont

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setFont(QFont("unifont"));    //该程序内使用字体unifont
    MainWindow w;
    w.show();
    return a.exec();
}

3.3 设定中文编码格式utf8(Linux下)
 QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));

3.4 在使用中文字符串的地方用tr转换即可
 ui->action_Open->setText(tr("打开"));
    ui->action_Play->setText(tr("播放"));
    ui->action_Pause->setText(tr("暂停"));
    ui->action_Stop->setText(tr("停止"));
    ui->action_Quit->setText(tr("退出"));

Qt embeded 4.5.3 在ARM-Linux的移植相关推荐

  1. arm linux imx6u移植goahead web服务器

    arm linux imx6u移植goahead web服务器 源码下载 源码结构 源码移植 源码下载 1.源码版本goahead2.5 2. 百度云下载链接https://pan.baidu.com ...

  2. linux-arm下如何开启tftp传输,arm linux 下移植busybox 的tftp

    (1)进入busybox目录,make menuconfig ,然后在networking中勾选tftp项跟tftpd项. (2)配置/etc/inetd.conf 中关于tftp的选项(此部未验证, ...

  3. QT实现滑动切换界面,ARM/Linux触屏滑动切换界面,切换Qwidget

    QT实现滑动切换界面,触屏滑动切换界面 实现思想 实现过程 完整代码 实现思想 项目中要用到ARM,要求手势滑动能够切屏,首先我们想到使用 QGestureEvent,但使用起来比较麻烦,并且个人了解 ...

  4. ros在arm linux上移植,ROS在Zedboard上的移植

    ROS全称robot operaring system,一般ROS是应用在Ubuntu系统中,本次移植是将ROS移植到Zedboard上的Linaro系统中去. 移植环境 开发板 : Zedboard ...

  5. ARM+linux系统移植3G拨号上网收发短信(三)【转】

    本文转载自:http://blog.csdn.net/hanmengaidudu/article/details/17099755 一.用text查看模式 下面的"发"是指我敲的命 ...

  6. openssh arm linux 编译,移植openssh到arm linux

    一.在移植之前需要准备做一些前期准备: 1.移植zlib库 1.1获取zlib源码 1.2解压 tar xvf zlib-1.2.11.tar.xz 1.3交叉编译 1.3.1 指定交叉编译器 exp ...

  7. linux 内核移植和根文件系统的制作【转载】

    原文地址:http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076214.html 1.1 Linux内核基础知识 在动手进行Linux内核移植之 ...

  8. Linux内核移植和根文件系统制作(详细步骤精讲)

    第一章移植内核 1.1 Linux内核基础知识 1.1.1 Linux版本 1.1.2 什么是标准内核 1.1.3 Linux操作系统的分类 1.1.4 linux内核的选择 1.2 Linux内核启 ...

  9. 【Qt开发】【VS开发】【Linux开发】OpenCV、Qt-MinGw、Qt-msvc、VS2010、VS2015、Ubuntu Linux、ARM Linux中几个特别容易混淆的内容...

    [Qt开发][VS开发][Linux开发]OpenCV.Qt-MinGw.Qt-msvc.VS2010.VS2015.Ubuntu Linux.ARM Linux中几个特别容易混淆的内容 标签:[Qt ...

  10. ARM Linux Qt 5.x.x 无标题栏

    /********************************************************************************** ARM Linux Qt 5.x ...

最新文章

  1. 从FFmpeg 4. 2源码中提取dshow mjpeg code步骤
  2. Linux服务器网络故障诊断
  3. python自动化运维平台能用php开发吗_关于数据库自动化运维平台的设计及开发实现思路...
  4. public、protected、default、private区别
  5. SQL Server中各个系统表的作用
  6. 数学之美 系列十一 - Google 阿卡 47 的制造者阿米特.辛格博士
  7. 解析:为什么人工智能要用Python?
  8. SQL2005删除用户的时候,产生“数据库主体在该数据库中拥有架构,无法删除”的解决办法...
  9. 全球金融中心最新排位:深圳重回前十,大连杭州飙升
  10. 无法使用struts2注释_带有注释且没有struts.xml文件的Struts 2 Hello World示例
  11. NHibernate1.2在VS2005里使用的基础
  12. TypeError: unhashable type: ‘numpy.ndarray‘
  13. Robocode 超级机器人 “波”统计瞄准算法
  14. bilibili、腾讯视频下载方法及过程中遇到的一些问题
  15. wget php mirror 地址,wget命令镜像网站
  16. Excel 按照某一列不同内容插入分页符号
  17. 解决Chromedriver报错Original error: chrome not reachable
  18. uboot 引导linux内核 参数mem=size,Uncompressing Linux..... done, booting the kernel.
  19. meso-四(邻烷氧基苯基)卟啉合钴(meso-T(2-ROP)PCo);meso-四-(N-苄基)吡碇基卟啉锌(ZnTBPyP);离子型锰卟啉化合物[MnTTMAPP][PF6]5齐岳供应
  20. R语言笔记7:functions——编写函数所需的基础知识

热门文章

  1. java退出程序的各种方式
  2. Dell戴尔笔记本电脑灵越Inspiron 7591原装出厂Windows10系统恢复原厂oem系统
  3. ModBus通信协议的【主从模式】
  4. 2005年春节联欢晚会对联汇总
  5. 漏洞命名规则及其正则表达式判断
  6. WAL的概念与实践分析
  7. 计算机毕业设计Java茶叶销售网站(源码+系统+mysql数据库+lw文档)
  8. 汽车智能座舱中 显示屏市场战略趋势分析 上篇
  9. 华为是怎样研发的(18)——质量回溯
  10. 使用 Docker 开发镜像编译Doris0.12.0(采坑)