最近在做一个项目,需要在一块开发板上做一个界面,开发板是瑞芯微电子的RK3399,这种板子刚出时间不长,处理器是64位的ARMV8。

一开始完全不知道怎样下手,最初纠结的问题是:到底是直接在板子上安装Qt,直接在板子上开发还是在电脑上安装交叉编译环境(在电脑上开发,再移植在开发板上)。首先尝试了交叉编译,一头雾水,根本不知道怎样编译,之前做过一个在32位开发板上的小项目,尝试过交叉编译,用的是arm-linux-gcc编译器,时间过去很久了,也已经忘了,而现在是64位的板,肯定不能用arm-linux-gcc编译器了。然后又在板子上安装了Qt,用命令安装的,安装上之后根本不能用,qmake不能用,提示:No compiler can produce code for this Qt version. Please define one or more compilers.网上也找不到解决方法,只能又尝试交叉编译。

交叉编译过程:首先找了一篇博文(https://www.cnblogs.com/wanglouxiaozi/p/9521950.html)跟着文章一步步做,用的Qt版本是4.7.3,原文中说的的配置过程中用到了一个参数 -embedded armv8,意思就是嵌入式平台是ARMV8,而指定这样一个参数,会在配置完后出现一个警告:

NOTICE: Atomic operations are not yet supported for this
        architecture.

Qt will use the 'generic' architecture instead, which uses a
        single pthread_mutex_t to protect all atomic operations. This
        implementation is the slow (but safe) fallback implementation
        for architectures Qt does not yet support.

Qt is now configured for building. Just run 'make'.
Once everything is built, you must run 'make install'.
Qt will be installed into /opt/qt-4.7.3-arm64

To reconfigure, run 'make confclean' and 'configure'.

这个意思就是当前的Qt不支持这个架构(ARMV8),而博主似乎没有发现问题,而认为这是配置成功的标志,继续往下进行,也就是make,因为在ARMV8上编译Qt的文章很少,我也找不到其他的文章,于是继续跟着走,果然到了下面报错了:(作者也指出了一个可能出现的错误,但这里不是)

上网找了好长时间也没能找到解决办法,我想是不是Qt的版本太低,不支持ARMV8架构,就换了一个高一点的版本Qt5.6.0,又找了一篇CSDN的博文(移植QT5.7.0到64位fireflyPK3399开发板),跟着文章做,编译仍然会出错误

又出现了新的问题:Project ERROR: Unknown module(s) in QT: quick,也很难解决,上网搜了很长时间没有找到什么有效的解决办法。

后来实在没有了办法,又下载了一个更高版本的Qt5.9.6,编译不出意外仍然出错,这次的错误是一个文件中的函数找不到原型:

No matching function for call to qBound(double, qreal&, double)

这个问题更难找到了,网上几乎没有,只好自己看编译过程,跟着编译报的错找到了那个文件,然而并没有找到什么有价值的信息,又上网找啊找,各种改配置文件,改一次,编译一次,从开始到报错要一个多小时,还是通不过。最后在一篇博文里发现是qreal这个参数的问题,在usr/include/qt4/Qt/qglobal.h头文件中有qreal的定义:

// This logic must match the one in qmetatype.h
#if defined(QT_COORD_TYPE)
typedef QT_COORD_TYPE qreal;
#elif defined(QT_NO_FPU) || defined(QT_ARCH_ARM) || defined(QT_ARCH_WINDOWSCE) || defined(QT_ARCH_SYMBIAN)
typedef float qreal;
#else
typedef double qreal;
#endif

在这里可以看到,如果处理器架构是ARM的,那么qreal就会被设置为float,所以在编译的时候,类型为double的数据或者函数,就会与qreal关键字不匹配了。为什么设置为float就不可以呢?目前不清楚,但我猜想是因为ARMV8是64位的架构,float是单精度占32位,double是双精度,占64位(猜想而已)。

搞清楚了这一点,就都明白了,解决方法也很简单,只要在编译时加上参数:-qreal double,即可编译通过。解决问题过程中参照的一篇博文里是将参数设置为了-qreal float,也难怪会出现问题。

交叉编译Qt5.9.6中的问题及其解决相关推荐

  1. Qt移植:Ubuntu16.04 交叉编译qt5.9.6详细教程

    前言: 项目需要移植qt到arm开发板上,历经千辛万苦解决了各种问题,最后终于成功了,所以整理了开发笔记给更多的小伙伴参考. 1.准备阶段 ①下载交叉编译器aarch65-linux-gnu,下载地址 ...

  2. linux qt5.9交叉编译,ubuntu16交叉编译Qt5.9

    1.安装交叉编译器 一般购买ARM开发板,对应的交叉编译器会由厂商提供.交叉编译器也就是能在X86的环境下编译出ARM中能运行的程序,例如cortex-A9的交叉编译器: 将这个包在ubuntu中解压 ...

  3. pyqt界面屏幕分辨率自适应_在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法

    在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法 PyQt5: 程序入口添加 QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHi ...

  4. windows中运行qt5构建的程序提示 无法启动此程序,因为计算机中丢失qt5Cored.dll 解决方法

    如果在windows中运行qt5构建的程序提示:无法启动此程序,因为计算机中丢失qt5Cored.dll 解决方法如下 1.用release构建项目 2.把缺少的dll文件,从C:\Qt\Qt5.0. ...

  5. 用开放地址法中的线性探查法解决冲突实现哈希表的运算

    为了更深的理解哈希算法,自己写了用开放地址法中的线性探查法解决冲突实现哈希表的运算. /*** Created by lirui on 14-8-13.* 用开放地址法中的线性探查法解决冲突实现哈希表 ...

  6. 在SpringBoot中使用Spring Session解决分布式会话共享问题

    在SpringBoot中使用Spring Session解决分布式会话共享问题 问题描述: 每次当重启服务器时,都会导致会员平台中已登录的用户掉线.这是因为每个用户的会话信息及状态都是由session ...

  7. ACM图灵奖获得者:想从大数据中获益,先解决集成问题!

    文章讲的是ACM图灵奖获得者:想从大数据中获益,先解决集成问题!如今,大数据对所有行业都产生了深远影响:从医疗保健.汽车.电信到物联网.随着数据浪潮的持续,企业都在寻找更新的管理和分析方法.收集可行的 ...

  8. 在vue中,Echarts雷达图中indicator的点击事件,不能改变data中的值的解决方法

    在vue中,Echarts雷达图中indicator的点击事件,不能改变data中的值的解决方法 参考文章: (1)在vue中,Echarts雷达图中indicator的点击事件,不能改变data中的 ...

  9. CentOS7安装CDH 第三章:CDH中的问题和解决方法

    CentOS7安装CDH 第三章:CDH中的问题和解决方法 参考文章: (1)CentOS7安装CDH 第三章:CDH中的问题和解决方法 (2)https://www.cnblogs.com/yang ...

最新文章

  1. ViewPager 的点击事件回调
  2. dnf mysql数据库密码,CentOS7使用dnf安装mysql的方法
  3. 心系农业心系农民-农民丰收节·林裕豪:企业在实践当中参与
  4. Linux Shell脚本编程--grep命令
  5. 程序员最常见的谎话,太准了
  6. 不宜过分炒作第三代半导体材料弯道超车
  7. left join 大表放前面_带娃时,走在孩子前面与跟在孩子身后区别很大,很多父母都做错了...
  8. Java是块级作用域吗_javascirpt如何模仿块级作用域(js高程笔记)
  9. 新软件--AutoReply(自动回复),还能自动接听,做答录机
  10. 机器学习/深度学习常用数据集归纳(附百度网盘链接)
  11. 详解电商订单逻辑流程图
  12. (附源码)Springboot酒店会员点餐系统 毕业设计 072005
  13. ADS学习:统计分析——灵敏度分析、良率优化
  14. 《拥抱》---梦中好友s:103
  15. Java锁Synchronized对象锁和类锁区别(搬运)
  16. Dialog dismiss 流程
  17. android模拟器mac版本下载,MaxMac电脑版怎么下载 安卓模拟器电脑版下载地址
  18. Apache DolphinScheduler 社区呼唤志愿者
  19. vue2.x的h函数(createElement)与vue3中的h函数
  20. 多方面看IP地址与常见的端口号~华山论剑

热门文章

  1. 118114与114的区别
  2. 怎么在电脑上找到自己安装的软件的安装包
  3. python读取excel文档的sheet
  4. 【智能制造】人工智能时代:互联网推动制造业升级的四大方向
  5. AIGC时代,分享11款超实用AI生成内容检测工具
  6. ubuntu 18.04 git clone 出错symbol lookup error: libhogweed.so.4: undefined symbol: __gmpn_cnd_add_n
  7. spring boot教学管理平台毕业设计源码281454
  8. 世界上最健康的工程师作息表!
  9. 如何把打游戏的精力用在学习上
  10. lol八月那服务器有无限火力,LOL英雄联盟无限火力什么时候开 2018无限火力开放时间...