QT5+OpenGL es2 + eglfs交叉编译实战:RK3399平台疑难解析与优化

1. 环境准备与文件系统搭建:从零开始的避坑指南

这次在RK3399上折腾QT5.14.2的交叉编译,说实话,比上次在其它RK平台要“酸爽”不少。很多朋友可能觉得,环境搭建不就是照着文档敲命令吗?但嵌入式开发最磨人的地方,恰恰就是这些看似基础的环境配置。我这次选择的主机系统是Ubuntu 20.04,和目标机系统保持一致,这是为了最大程度避免因glibc版本、内核头文件差异带来的“玄学”问题。很多编译错误,追根溯源可能就是主机和目标机库版本不匹配,所以第一步的选择就很重要。

我这次没有采用直接挂载目标机SD卡或NFS文件系统的方式,而是创建了一个独立的sysroot目录,比如 /opt/sysroot/host。为什么这么做?因为直接挂载物理文件系统,万一操作失误(比如rm -rf手滑了),那就是灾难性的。而复制一份出来,就相当于有了一个“沙盒”,随便折腾,大不了删了重来。复制完文件系统后,记得先给 /opt 目录一个宽松的权限(比如 sudo chmod 777 /opt),不然在创建子目录和复制文件时,权限问题会让你寸步难行。复制命令很简单:sudo cp -a /path/to/your/rootfs/* /opt/sysroot/host/。这里的 -a 参数是关键,它能保留所有文件属性和符号链接。

文件系统复制好了,但它还是个“死”的,我们没法在里面安装软件。这时候就需要用 chroot 把它“激活”。但直接 chroot 会失败,因为 /proc, /sys, /dev 这些虚拟文件系统没挂载进去。我写了一个 ch-mount.sh 脚本来自动化这个过程,实测下来非常稳。脚本的核心就是两个函数:mnt() 负责挂载必要的虚拟文件系统并执行 chrootumnt() 则在操作结束后负责卸载。使用起来就两条命令:./ch-mount.sh -m /opt/sysroot/host 进入沙盒环境,./ch-mount.sh -u /opt/sysroot/host 退出并卸载。这里有个血泪教训:操作结束后,一定要执行卸载命令! 我有一次忘了卸载,直接删除了 host 目录,结果导致主机系统的 /dev 目录出现异常,一些设备节点消失了,最后只能重启解决。所以,这个卸载步骤不是可选项,是必须项。

进入 chroot 环境后,你就可以像在目标板上一样使用 apt 安装依赖库了。首先记得更新源列表:apt update。然后就可以安装编译QT所需的基础依赖,比如 build-essential, libglib2.0-dev 等等。这个环境是你专属的、干净的编译依赖库来源,不会污染主机系统,管理起来非常清晰。

2. GPU库路径冲突:OpenGL ES2无法显示的元凶

环境搭好,按照之前的经验配置、编译、部署,一气呵成。我习惯用 qt3d 例子里的 scene3d 来测试3D加速是否正常。结果程序跑起来了,窗口一片黑,GPU利用率通过 cat /sys/devices/platform/*.gpu/utilisation 查看,始终是0。这明显是OpenGL渲染没跑在Mali GPU上,或者根本就没初始化成功。

排查的第一步是看QT的配置。我在 qmake.confconfigure

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值