news 2026/6/12 13:52:01

嵌入式 Qt 移植:Linux 交叉编译、触摸屏、字体部署

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式 Qt 移植:Linux 交叉编译、触摸屏、字体部署

嵌入式 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 -v
2. 依赖库准备

主机安装编译依赖:

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 install
3. 关键说明
  1. xplatform对应qtbase/mkspecs/下的交叉配置文件,根据编译器修改qmake.conf内编译器路径;
  2. 按需裁剪:-nomake examples -nomake tests减小体积;
  3. 有硬件 GPU 则开启 OpenGL,无 GPU 关闭。
4. 编译完成

-prefix指定目录生成 ARM 版本 Qt 库、qmake、工具链。


四、第三步:嵌入式应用交叉编译

  1. 使用编译出的 ARM 版qmake编译业务工程

    bash

    运行

    # 进入工程目录 /opt/qt-arm/bin/qmake make
  2. 得到 ARM 架构可执行程序。

五、第四步:开发板环境部署(系统侧配置)

将 Qt 运行时库、字体、插件拷贝到开发板。

1. 拷贝 Qt 动态库与插件

把主机/opt/qt-arm/libplugins目录完整拷贝到开发板/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_calibrate
3. 多点触摸

确认内核已开启多点触摸驱动,Qt 输入插件默认支持。


七、字体部署(中文乱码、方框□ 解决)

现象

英文正常,中文显示为方框、问号,本质:缺少中文字体文件

解决方案
  1. 准备开源中文字体:NotoSansCJK、文泉驿、微软雅黑等ttf/ttc文件;
  2. 在板端 Qt 库目录下创建字体文件夹:

    bash

    运行

    mkdir -p /usr/local/qt/lib/fonts
  3. 将字体文件放入该目录;
  4. 配置字体路径环境变量:

    bash

    运行

    export QT_FONTDIR=/usr/local/qt/lib/fonts
  5. 代码内指定字体(兜底方案)

    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或系统开机服务。


九、常见问题排错

  1. error while loading shared libraries原因:找不到 Qt 动态库 → 检查LD_LIBRARY_PATH
  2. 无法打开 /dev/fb0原因:帧缓冲未启用、权限不足 →chmod 777 /dev/fb0
  3. 触摸无响应检查 event 节点、QT_QPA_PLATFORM变量、内核驱动。
  4. 中文方框检查字体文件、QT_FONTDIR、字体名称是否匹配。
  5. 程序运行崩溃架构不匹配(ARM/x86)、编译链版本不一致。

小结

嵌入式 Qt 移植标准流程:

搭建交叉编译器 → 源码交叉编译Qt → 应用交叉编译 → 板端部署库+插件+字体 → 配置帧缓冲/触摸环境变量 → 编写启动脚本与自启动

触摸、字体、库路径是嵌入式三大经典问题,优先排查这三项。


全系列收尾

至此,Qt 基础 → 控件 → 实战项目 → 排错优化 → 版本迁移 → 嵌入式移植全套技术博客完成,覆盖桌面开发、移动端 QML、服务器后台、嵌入式 Linux 全场景,可作为完整学习与项目参考文档。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 13:50:55

Motorola Suite56 DSP开发工具链:从汇编优化到硬件调试的完整指南

1. 项目概述:为什么我们需要一套完整的DSP开发工具链?如果你正在或即将踏入数字信号处理(DSP)的嵌入式开发领域,尤其是面对像Motorola(后来的Freescale,现NXP)DSP56300系列这样的经典…

作者头像 李华
网站建设 2026/6/12 13:45:54

别再死记硬背了!用一张图搞懂Autosar COM层如何拆解和打包CAN信号

可视化拆解Autosar COM层:从信号拆包到报文组装的实战指南在汽车电子领域,Autosar COM层就像一位精通多国语言的翻译官,负责将ECU内部的各种信号"方言"转换为标准的总线"普通话"。但对于刚接触Autosar通信栈的工程师来说…

作者头像 李华
网站建设 2026/6/12 13:45:51

ColabFold完整指南:如何免费预测蛋白质三维结构

ColabFold完整指南:如何免费预测蛋白质三维结构 【免费下载链接】ColabFold Making Protein folding accessible to all! 项目地址: https://gitcode.com/gh_mirrors/co/ColabFold 你是否曾想了解蛋白质的神秘三维世界,却被昂贵的实验设备和复杂的…

作者头像 李华
网站建设 2026/6/12 13:39:57

LS2085A网络智能平台:从异构架构到DPAA2数据平面开发实战

1. 项目概述:为什么我们需要LS2085A这样的网络智能平台?如果你在过去几年里折腾过企业级网络设备,或者深度参与过云数据中心的建设,你肯定对“软件定义一切”这个词不陌生。从软件定义网络(SDN)到网络功能虚…

作者头像 李华