QT4.8.6的交叉编译 - 编译平台:Ubuntu 20.04 LTS,目标平台:linux/imx6ull

这篇博客详细介绍了如何在Ubuntu 20.04 LTS环境下,使用arm-linux-gnueabihf-GCC 4.9.1交叉编译QT 4.8.6,目标平台为Linux/iMX6ULL。内容涵盖开发环境准备、交叉工具链和ts库的安装、QT4.8.6的交叉编译、配置QT Creator以及移植qt库到开发板的全过程。特别强调了编译器版本对编译结果的影响以及如何解决编译和运行中遇到的问题。
摘要由CSDN通过智能技术生成

QT4.8.6的交叉编译 - 编译平台:Ubuntu 20.04 LTS,目标平台:linux/imx6ull

Date Author Version Note
2021.07.06 Dog Tao V1.0 完成文档的撰写。
2021.07.15 Dog Tao V1.1 增加了由于不同编译配置而导致动态库调用报错的解决方法:修改QT_BUILD_KEY宏定义

开发环境准备

  • 编译环境: 64位Ubuntu 20.04 LTS
  • 交叉编译工具链: arm-linux-gnueabihf-GCC 4.9.1
  • 本地编译器:gcc version 7.5.0 (Ubuntu 7.5.0-6ubuntu2)
  • QT版本: QT-4.8.6
  • 硬件平台: i.mx6ull
  • 编译所需的包为: ARM-Linux-GCC-4.9.1.tar.bz2, tslib-1.4.tar.gz, qt-everywhere-opensource-src-4.8.6.tar.gz

项目地址(不开源):

Gitee仓库不开源,需要请邮件本文作者

Qt-everywhere-opensource源码:

Index of /archive

特别说明1

笔者已经在Ubuntu 16.04, 18.04, 20.04三个版本中成功实现Qt的交叉编译,但这并不说明本项目是与Linux版本无关的。目前确定的是本机的gcc/g++编译器版本会影响编辑的结果。例如Ubuntu 20.04LTS系统自带的gcc编译器版本为9.3.0,使用这个版本的编译器是无法完成Qt的交叉编译的。

Untitled.png

为了解决这个问题,应当安装gcc-7编译器:

sudo apt install gcc-7 g++-7
gcc-7 -v

可以设置系统默认的gcc/g++编译器版本号,也可以在qt源码的mkspecs中更改默认的编译器:QMAKE_CC = gcc-7

Untitled201.png

特别说明2

在Qt mkspecs中选择合适的平台并修改交叉编译的选项。

  • 进入**qt-everywhere-opensource-src-4.8.6/mkspecs/qws/linux-arm-g++**目录
  • 修改qmake.conf文件:arm-linux → arm-linux-gnueabihf -lts (-lts是因为使用了tslib库)
  • 配置Qt编译选项时,需要使用**-xplatform qws/linux-arm-g++**选项指定我们调整过的mkspecs

Untitled202.png

如果在后面程序的编译过程中(加载插件、调用动态库)出现了如下类似报错:

The plugin ‘/usr/lib/libEWhalesInputMethodPro.so’ uses incompatible Qt library. Expected build key “arm linux gnueabihf-g++ no-pkg-config”, got “arm linux g++ no-pkg-config”:

则需要检查源码中对QT_BUILD_KEY的定义,修改qt-everywhere-opensource-src-4.8.6/src/corelib/global/qglobal.h文件:

  • #define QT_BUILD_KEY "arm linux g++ no-pkg-config"改为#define QT_BUILD_KEY "arm linux gnueabihf-g++ no-pkg-config"
  • #define QT_BUILD_KEY_COMPAT3 "armv6 linux g++ no-pkg-config"改为#define QT_BUILD_KEY_COMPAT3 "armv6 linux gnueabihf-g++ no-pkg-config"

如果已经编译完成,则可以直接修改<QtCore/qconfig.h>头文件,修改的内容与上述文件相同。

Untitled203.png

特别说明3

从笔者的交叉笔译实战来看,能解决编译过程中遇到问题的关键在于了解Qt从源代码编译成可以部署到嵌入式系统中的过程。这个过程分为两个核心的部分,分别使用了本地编译器与交叉编译工具链,任何一个环节出错都可能导致最终的编译失败,而且这种出错不一定是显性报错的。举例说明:

进行第一阶段编译时,生成的Qt-tools可执行程序位于bin文件夹。其中,uic程序是用来将页面设计文件(.ui)转化为对应的头文件(.h)。如果本地编译器GCC的版本为V9.3,程序会工作异常,导致页面设计相关的头文件出错,进而使得后续的Qt-opensource源码编译过程出错。如果将编译器版本换成GCC-V7,则uic程序运行正常,Qt源码可以正常编译。

Qt_cross_compile.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全能骑士涛锅锅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值