嵌入式 Qt 典型场景:ARM 架构 Linux 开发板(ARM32/ARM64)。
整体流程:搭建交叉编译链 → 交叉编译 Qt 源码 → 开发板环境配置(驱动 / 字体 / 触摸)→ 应用编译与部署。
一、整体架构说明
- 编译主机:PC Ubuntu / CentOS(x86_64)
- 目标板:ARM Linux(如 IMX6、RK3588、全志等)
- 方式:源码交叉编译 Qt+ 应用交叉编译 + 板端运行时环境部署
二、第一步:准备交叉编译环境
1. 安装交叉编译器
以 ARM-linux-gcc 为例,解压并配置环境变量
bash
运行
# 临时生效 export PATH=$PATH:/opt/arm-gcc/bin # 永久生效:写入 ~/.bashrc source ~/.bashrc # 测试 arm-linux-gcc -v2. 依赖库准备
主机安装编译依赖:
bash
运行
sudo apt install libxcb* libx11-dev libgl1-mesa-dev build-essential bison flex三、第二步:Qt 源码交叉编译(核心步骤)
1. 获取 Qt 源码
推荐 Qt5.15 / Qt6 长期版本,下载源码并解压。
2. 编写交叉编译配置脚本build.sh
bash
运行
#!/bin/sh ./configure \ -prefix /opt/qt-arm \ # 编译输出目录 -embedded arm \ # 目标架构 -xplatform linux-arm-gnueabi-g++ \ # 交叉编译配置文件 -shared \ # 动态库 -opensource -confirm-license \ -no-xcb \ # 嵌入式不使用xcb -no-opengl \ # 根据板子GPU选择开启/关闭 -widgets \ -sql-sqlite \ # 内置SQLite -make libs -nomake examples -nomake tests make -j8 make install3. 关键说明
xplatform对应qtbase/mkspecs/下的交叉配置文件,根据编译器修改qmake.conf内编译器路径;- 按需裁剪:
-nomake examples -nomake tests减小体积; - 有硬件 GPU 则开启 OpenGL,无 GPU 关闭。
4. 编译完成
在-prefix指定目录生成 ARM 版本 Qt 库、qmake、工具链。
四、第三步:嵌入式应用交叉编译
- 使用编译出的 ARM 版
qmake编译业务工程bash
运行
# 进入工程目录 /opt/qt-arm/bin/qmake make - 得到 ARM 架构可执行程序。
五、第四步:开发板环境部署(系统侧配置)
将 Qt 运行时库、字体、插件拷贝到开发板。
1. 拷贝 Qt 动态库与插件
把主机/opt/qt-arm/lib、plugins目录完整拷贝到开发板/usr/local/qt/。
2. 配置板端环境变量(/etc/profile)
bash
运行
# Qt 库路径 export LD_LIBRARY_PATH=/usr/local/qt/lib:$LD_LIBRARY_PATH # Qt 插件路径 export QT_PLUGIN_PATH=/usr/local/qt/plugins # 嵌入式平台变量 export QTDIR=/usr/local/qt执行source /etc/profile生效。
六、触摸屏适配(嵌入式高频问题)
问题现象
触摸无反应、坐标错位、单点变多点、光标乱跑。
1. 输入平台选择
嵌入式 Linux 触摸常用evdev 输入插件。
启动程序前指定环境变量:
bash
运行
# 使用Linux原生输入子系统 export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0 export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0/dev/fb0:帧缓冲设备/dev/input/event0:触摸事件节点(根据实际板子调整)
2. 坐标校准
触摸坐标颠倒 / 偏移:使用 Qt 自带校准工具或板子原厂触摸校准程序。
bash
运行
# 部分版本提供触摸校准 ts_calibrate3. 多点触摸
确认内核已开启多点触摸驱动,Qt 输入插件默认支持。
七、字体部署(中文乱码、方框□ 解决)
现象
英文正常,中文显示为方框、问号,本质:缺少中文字体文件。
解决方案
- 准备开源中文字体:
NotoSansCJK、文泉驿、微软雅黑等ttf/ttc文件; - 在板端 Qt 库目录下创建字体文件夹:
bash
运行
mkdir -p /usr/local/qt/lib/fonts - 将字体文件放入该目录;
- 配置字体路径环境变量:
bash
运行
export QT_FONTDIR=/usr/local/qt/lib/fonts - 代码内指定字体(兜底方案)
cpp
运行
QFont font("Noto Sans CJK SC"); a.setFont(font); // a 为 QApplication
八、启动脚本与自启动
编写启动脚本start_app.sh
bash
运行
#!/bin/sh # 环境变量 export LD_LIBRARY_PATH=/usr/local/qt/lib export QT_PLUGIN_PATH=/usr/local/qt/plugins export QT_FONTDIR=/usr/local/qt/lib/fonts export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0 # 运行程序 ./my_app添加执行权限:chmod +x start_app.sh
开机自启动:将脚本加入/etc/rc.local或系统开机服务。
九、常见问题排错
- error while loading shared libraries原因:找不到 Qt 动态库 → 检查
LD_LIBRARY_PATH。 - 无法打开 /dev/fb0原因:帧缓冲未启用、权限不足 →
chmod 777 /dev/fb0。 - 触摸无响应检查 event 节点、
QT_QPA_PLATFORM变量、内核驱动。 - 中文方框检查字体文件、
QT_FONTDIR、字体名称是否匹配。 - 程序运行崩溃架构不匹配(ARM/x86)、编译链版本不一致。
小结
嵌入式 Qt 移植标准流程:
搭建交叉编译器 → 源码交叉编译Qt → 应用交叉编译 → 板端部署库+插件+字体 → 配置帧缓冲/触摸环境变量 → 编写启动脚本与自启动。
触摸、字体、库路径是嵌入式三大经典问题,优先排查这三项。
全系列收尾
至此,Qt 基础 → 控件 → 实战项目 → 排错优化 → 版本迁移 → 嵌入式移植全套技术博客完成,覆盖桌面开发、移动端 QML、服务器后台、嵌入式 Linux 全场景,可作为完整学习与项目参考文档。