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
项目地址(不开源):
Qt-everywhere-opensource源码:
特别说明1
笔者已经在Ubuntu 16.04, 18.04, 20.04三个版本中成功实现Qt的交叉编译,但这并不说明本项目是与Linux版本无关的。目前确定的是本机的gcc/g++编译器版本会影响编辑的结果。例如Ubuntu 20.04LTS系统自带的gcc编译器版本为9.3.0,使用这个版本的编译器是无法完成Qt的交叉编译的。
为了解决这个问题,应当安装gcc-7编译器:
sudo apt install gcc-7 g++-7
gcc-7 -v
可以设置系统默认的gcc/g++编译器版本号,也可以在qt源码的mkspecs中更改默认的编译器:QMAKE_CC = gcc-7
特别说明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
如果在后面程序的编译过程中(加载插件、调用动态库)出现了如下类似报错:
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>
头文件,修改的内容与上述文件相同。
特别说明3
从笔者的交叉笔译实战来看,能解决编译过程中遇到问题的关键在于了解Qt从源代码编译成可以部署到嵌入式系统中的过程。这个过程分为两个核心的部分,分别使用了本地编译器与交叉编译工具链,任何一个环节出错都可能导致最终的编译失败,而且这种出错不一定是显性报错的。举例说明:
进行第一阶段编译时,生成的Qt-tools可执行程序位于bin文件夹。其中,uic程序是用来将页面设计文件(.ui)转化为对应的头文件(.h)。如果本地编译器GCC的版本为V9.3,程序会工作异常,导致页面设计相关的头文件出错,进而使得后续的Qt-opensource源码编译过程出错。如果将编译器版本换成GCC-V7,则uic程序运行正常,Qt源码可以正常编译。