QT5.5移植到ARM全攻略

一、编译

  1. www.qt.io下载源码,qt-everywhere-opensource-src-5.5.0
  2. 设置编译器或者说平台。编译器是通过xplatform参数指定的,xplatform后面跟的参数实际上就时qtbase/mkspec下的文件夹的名字,这里以linux-arm-gnueabi-g++为模板,拷贝这个文件夹,重命名为arm-linux,然后修改这个文件夹里的qmake.conf,修改后的内容如下:

    <code class="hljs livecodeserver has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;">
    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#  modifications to g++.conf</span>
    
    QMAKE_CC                = arm-<span class="hljs-constant" style="box-sizing: border-box;">none</span>-linux-gnueabi-gcc
    QMAKE_CXX               = arm-<span class="hljs-constant" style="box-sizing: border-box;">none</span>-linux-gnueabi-g++
    QMAKE_LINK              = arm-<span class="hljs-constant" style="box-sizing: border-box;">none</span>-linux-gnueabi-g++
    QMAKE_LINK_SHLIB        = arm-<span class="hljs-constant" style="box-sizing: border-box;">none</span>-linux-gnueabi-g++
    
    
    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># modifications to linux.conf</span>
    
    QMAKE_AR                = arm-<span class="hljs-constant" style="box-sizing: border-box;">none</span>-linux-gnueabi-ar cqs
    QMAKE_OBJCOPY           = arm-<span class="hljs-constant" style="box-sizing: border-box;">none</span>-linux-gnueabi-objcopy
    QMAKE_NM                = arm-<span class="hljs-constant" style="box-sizing: border-box;">none</span>-linux-gnueabi-nm -P
    QMAKE_STRIP             = arm-<span class="hljs-constant" style="box-sizing: border-box;">none</span>-linux-gnueabi-strip</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li></ul>

    这里修改的就是交叉编译器的名字,根据个人情况而定,我使用的是友善的编译器。

  3. 配置。 

    ./configure --prefix=/QT5.5 -no-c++11 -no-qml-debug -xplatform arm-linux -qt-freetype -no-opengl -qt-pcre -nomake tests -nomake examples -sysroot /opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/sys-root/ -v 

    这里的arm-linux就上上面拷贝的文件夹的名字。这里需要说明的是sysroot,指定了sysroot,编译器就会到sysroot目录去找头文件和库,否则就会去本机找,网上的移植过程基本都没设置这个路径,在qt的官网上可以找到这个说明http://doc.qt.io/qt-5/embedded-linux.html,设置了sysroot之后,这个目录就是根目录了,prefix是相对于这个目录来安装的,也就是说make install后,qt的库安装到了/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/sys-root/QT5.5目录下。这个配置可能会提示跟xcb相关的东西,按照提示安装相关软件即可。配置之后,qt会提示你加上-qreal float选项,这个是为了跟以前的兼容,这里没有加,如果加上也没问题,加上之后会碰到编译上的一些问题,这个在编译小节里说明。
  4. 编译。编译过程中,碰到了几个问题。 
    • clock_gettime相关的错误。根据提示在源文件所在目录的Makefile里,找到LIBS加上-lrt
    • 因为加了-qreal float引起的编译问题,如果不加这个选项,就不存在这两个问题。都在qpdf.cpp中,一个是qBound(0., stops.at(i).first, 1.);其中qBound定义如下: 

      Q_DECL_CONSTEXPR inline const T &qBound(const T &min, const T &val, const T &max) 
      { return qMax(min, qMin(max, val)); } 

      qBound的3个参数是一样的,而stops.at(i).firstqreal类型的,0.1.double类型的,而qreal类型被指定为了float类型,所以就造成了这种编译问题,可以将stops.at(i).first强制转换为double类型。 
      另一个问题也在这里文件里,是<<符号的重载问题,代码如下: 

      QPdf::ByteStream s(&shader); 
      s << "<<\n" 
      "/ShadingType 2\n" 
      "/ColorSpace " << (alpha ? "/DeviceGray\n" : "/DeviceRGB\n") << 
      "/AntiAlias true\n" 
      "/Coords [" << start.x() << start.y() << stop.x() << stop.y() << "]\n" 
      "/Extend [true true]\n" 
      "/Function " << function << "0 R\n" 
      ">>\n" 
      "endobj\n"; 

      这个地方没弄明白,ByteStream已经重载了qreal类型,提示是模糊的重载,有int或者char可以备选,将start.y()等强制转换为int后编译通过。
    • 因为配置的时候加了-no-opengl选项,在编译qt3d的时候,需要用到opengl的模块,编译不过。因为用不到opengl,所以将qt3d屏蔽掉。找到源码目录下的qt.pro,屏蔽掉下面两句话: 

      addModule(qt3d, qtdeclarative qtimageformats) 
      addModule(qtcanvas3d, qtdeclarative) 

      用#号将这两句话注释掉就可以了。
  5. 安装。make install

二、在目标板上运行

  1. 先编译一个qt程序,在qtcreator的管理构建套件里设置好QT Versions编译器,这里QT Versions要设置成安装之后QT5.5的qmake路径,本文里是/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/sys-root/QT5.5/bin/qmake这个路径,编译器就选/opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux-g++
  2. 将编译好的QT5.5拷贝到目标板上,这里放到/opt目录下。
  3. 指定QT的运行平台,这里使用linuxfb,QT有几种运行平台,在官网上有说明http://doc.qt.io/qt-5/embedded-linux.html,这里使用linuxfb,新建一个文件setqtenv.sh,写下如下内容: 

    export QTDIR=/opt/QT5.5 
    export QT_QPA_FONTDIR=$QTDIR/lib/fonts 
    export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins/ 
    export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH 
    export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=800x600:mmSize=800x600:offset=0x0:tty=/dev/tty1 

    如果不指定QT_QPA_FONTDIRQT就会到/QT5.5的路径下去找字体,结果就找不到了。如果不指定QT_QPA_PLATFORM_PLUGIN_PATH,应用程序启动的时候就会提示找不到linuxfblinuxfb是QT的一个插件,可以在/opt/QT5.5/plugins/platforms/文件夹下看到一个libqlinuxfb.soLD_LIBRARY_PATH是指定库的路径,这个就不说了,最熟悉的东西了。QT_QPA_PLATFORM是指定平台,fb指定framebuffer的设备地址,具体的参数在官网上有说明参见上面给出的链接。然后运行source setqtenv.sh添加这些环境变量,至此,界面就可以显示出来了。

三、支持触摸屏

  1. 首先应用程序要链接ts库,在qtcreator的工程文件里加上LIBS += -lts
  2. 设置触摸屏相关的环境变量,如下: 

    export QT_QPA_GENERIC_PLUGINS=tslib 
    export TSLIB_TSDEVICE=/dev/touchscreen-1wire 
    export TSLIB_CALIBFILE=/etc/pointercal 
    export TSLIB_CONFFILE=/etc/ts.conf 
    export TSLIB_PLUGINDIR=/usr/lib/ts 

  1. 这个QT_QPA_GENERIC_PLUGINS参数在官网上没找到说明,百度到的,在/opt/QT5.5/plugins/generic目录下可以看到一个libqtslibplugin.so,剩下的就是tslib的配置了,这里使用的是友善触摸屏,tslib已经移植好了,如果没有tslib的话,还需要移植tslib。至此,触摸屏就可以使用了,直接执行./ArmTest就可以了,不需要加其他参数,这里ArmTest是我的测试程序。
http://blog.csdn.net/tracing/article/details/49951633

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值