说明
- 本移植过程适用于韦东山 100ask_imx6ull_pro 的板子(这个板子上的 tslib 等已经移植好了),其他开发板可能需要配置更多的内容
- 本移植过程是基于 Buildroot 系统系统,还有其他方式可以移植 Qt
环境设备
- 交叉编译器:arm-linux-gnueabihf-gcc
- 编译平台:unbutu20.04
- ARM 开发板:100ask_imx6ull_pro
Qt 交叉编译
- 配置交叉编译工具链
- 进入
Buildroot_2020.02.x
文件夹(这个文件夹是最开始配置 ubuntu 环境时从韦东山的仓库中下载的) - 执行
make clean
- 执行
make 100ask_imx6ull_pro_ddr512m_systemV_qt5_defconfig
- 执行
make all -j4
注意这个过程会持续很长时间,中间也会出现很多错误,但不需要等到全部编译完,只需要在该文件夹下的
./output/host/bin/
文件夹下出现 qmake 工具即可
错误 1:
In file included from /usr/include/signal.h:328,
from ./signal.h:52,
from c-stack.c:49:
c-stack.c:55:26: error: missing binary operator before token "("
55 | #elif HAVE_LIBSIGSEGV && SIGSTKSZ < 16384
| ^~~~~~~~
CC c-strcasecmp.o
- 解决:找到 c-stack.c 文件,将下面内容注释掉
#ifndef SIGSTKSZ
## define SIGSTKSZ 16384
##elif HAVE_LIBSIGSEGV && SIGSTKSZ < 16384
/* libsigsegv 2.6 through 2.8 have a bug where some architectures use
more than the Linux default of an 8k alternate stack when deciding
if a fault was caused by stack overflow. */
## undef SIGSTKSZ
# define SIGSTKSZ 16384
#endif
错误 2:
error: ‘numeric_limits’ is not a member of ‘std’
: error: ‘::max’ has not been declared; did you mean ‘std::max’?
- 解决:找到相应的文件添加头文件:
#include <limits>
Qt 配置
IMX6ULL 配置
- 在将交叉编译好的 qt 文件拷贝到开发板后,运行发现存在触摸屏没反应、页面部分被主屏幕的内容覆盖等问题,下面一一解决:
- 解决触摸屏没反应的问题:在
/etc/profile
的文件中增加一行:
export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event1
- 解决页面部分被主屏幕内容覆盖的问题:将主屏幕界面禁用,在命令行中输入:
/etc/init.d/S05lvgl stop
- 注意每次开发板开机时都需要输入一次,如果不想每次输入可以在开机启动中添加这条命令
总结
- 在交叉编译 Qt 的过程中会出现各种奇奇怪怪的错误,但是想清楚编译的目的是为了得到 qmake,所以不需要全部解决编译错误
- Qt 的移植还有其他方法,如果是正点原子的板子可以参考正点原子官方视频