🧶 1. QT 简介
Qt 是一个跨平台的 C++ 图形用户界面(GUI)应用开发框架,具有良好的可移植性和模块化设计。它不仅支持桌面系统,还广泛应用于嵌入式设备上,例如工业控制终端、车载系统、触控面板等。Qt 提供了丰富的控件库、信号与槽机制、强大的多线程支持以及灵活的图形渲染能力,是嵌入式图形界面开发的常用选择。
🌱 2. 软硬件选型
在开始移植 Qt 之前,需要先明确软硬件平台的整体架构。Qt 的移植不仅仅是软件层面的工作,还会涉及到底层的显示屏驱动、触摸屏驱动以及系统图形库等硬件支持。因此,必须确保所选的 Qt 版本与嵌入式 Linux 内核和交叉编译环境相匹配。
🌼 2.1 硬件选型
- 单板:s5p6818单板(arm 32位架构 Linux 系统)
- LCD显示屏:wy070ml
- 触摸屏:gslx680-linux
🌻 2.2 软件选型
- 内核: Linux 3.49
- Qt软件: Qt 5.4.1
- 交叉编译工具链: arm-cortex_a9-linux-gnueabi-
- 中文字体库: wqy-zenhei.ttc
🌺 3. Qt 移植
🌹 3.1 配置交叉编译环境
将 Qt 5.4.1 源码包拷贝到合适的位置,并解压
bash
cp qt-everywhere-opensource-src-5.4.1.tar.gz /opt
cd /opt
tar -xvf qt-everywhere-opensource-src-5.4.1.tar.xz
然后为 Qt 创建好合适的安装目录
bash
mkdir -p /opt/project/qt/plugins
然后进入到源码中的 qtbase 目录
bash
cd qt-everywhere-opensource-src-5.4.1/qtbase
执行以下命令进行配置,生成 Makefile 文件
bash
./configure \
-prefix /opt/project/qt \
-plugindir /opt/project/qt/plugins \
-release \
-opensource \
-silent \
-strip \
-xplatform linux-arm-gnueabi-g++ \
-qt-libpng \
-qt-libjpeg \
-qt-freetype \
-no-iconv \
-no-openssl \
-no-cups \
-no-nis \
-no-glib \
-no-dbus \
-widgets \
-plugin-sql-sqlite \
-qt-sql-sqlite \
-no-accessibility \
-no-sse2 \
-make libs \
-nomake tools \
-nomake examples \
-nomake tests \
-linuxfb
这里需要注意几个参数:
-prefix /opt/project/qt
: 指定 Qt 的安装路径,所有库与工具文件会安装到该目录下。-plugindir /opt/project/qt/plugins
: 指定 Qt 插件的安装路径(图形、输入、平台后端等)。-xplatform linux-arm-gnueabi-g++
指定交叉编译工具链。-linuxfb
: 使用 Framebuffer 图形接口作为 Qt 的平台后端,适用于无 X11 的 LCD 屏幕。
就这几个参数需要视实际情况而定,其他的参数基本上照着抄就好。
在 ./configure 生成 Makefile 过程中可能会碰到如下提示

输入 yes 按回车即可
🌾 3.2 交叉编译和安装
编译环境配置完成后进行编译和安装
bash
make
make install
💡 提示:编译过大概需要半小时左右
(可以去泡杯茶吃块小蛋糕☕🍰)
编译和安装完成以后检查安装目录下是否生成库与可执行文件
bash
ls /opt/project/qt
然后用 SSH 链接单板,在单板上创建 Qt 目录后退出
bash
ssh root@192.168.10.29
mkdir -p /usr/local/qt
exit
然后使用 scp 将 PC 上的 lib 与 plugins 目录传输到目标单板的 Qt 目录下
bash
scp -rp /opt/project/qt/lib root@192.168.10.29:/usr/local/qt
scp -rp /opt/project/qt/plugins root@192.168.10.29:/usr/local/qt
🍂 3.3 确认触摸屏设备节点
使用 SSH 再次链接单板
bash
ssh root@192.168.10.29
然后使用 hexdump 工具检测触摸屏对应的输入设备节点
bash
hexdump /dev/input/event0
命令执行后触碰触摸屏观察有没有输出,如果没有输出按下 Ctrl+c
退出程序,检测下一个设备节点
bash
hexdump /dev/input/event1
如果还是没有反应继续检测下一个,直到终端上出现类似以下信息

记下这个设备节点的名称,他代表的就是触摸屏设备。在我这里是 event1 。
🍀 3.4 添加环境变量
在单板上打开 /etc/profile
文件,如果没有就创建
bash
vim /etc/profile
添加 以下环境变量
bash
# Qt 库与可执行文件路径
export QTDIR=/usr/local/qt
export PATH=$QTDIR:$PATH
export LD_LIBRARY_PATH=/usr/local/qt/lib:$LD_LIBRARY_PATH
# 插件与字体路径
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins
export QT_QPA_FONTDIR=$QTDIR/lib/fonts
export QT_QWS_FONTDIR=$QTDIR/lib/fonts
# LCD 显示设备与分辨率
export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0
export QWS_DISPLAY="LinuxFb:mmWidth300:mmHeight400:0"
export QWS_SIZE=1024x600
# 触摸屏设备配置
export TSDEVICE=/dev/input/event1
export QT_QPA_GENERIC_PLUGINS=evdevtouch:$TSDEVICE
export QWS_MOUSE_PROTO=evdevtouch:$TSDEVICE
这里倒数第三行环境变量的值需要填写刚才几下的触摸屏设备。
完成后保存退出,重启单板使配置生效
🍄 3.5 添加中文字体支持
在用 SSH 链接单板,删除单板上原有字体目录内容,并退出
bash
ssh root@192.168.10.29
rm -rf /usr/local/qt/lib/fonts/*
exit
将中文字体文件(wqy-zenhei.ttc)通过 scp 拷贝到单板字体目录:
bash
scp wqy-zenhei.tcc /usr/local/qt/lib/fonts
至此,单板上已经具备运行 Qt 程序的能力。
🪐 4. Qt 项目部署
🌲 4.1 配置 .pro 项目文件
进入 Qt 项目目录
bash
cd /opt/Qt/MimicHerb
使用 qmake 生成 .pro
项目文件
bash
/opt/project/qt/bin/qmake -project
该命令会根据项目中源文件(如 .cpp
、.h
、.ui
)自动生成一个 .pro
项目文件
然后编辑 .pro 项目文件
bash
vim MimicHerb.pro
在文件开头添加代码启用 Widgets 模块
bash
QT += widgets
💡 提示:如果项目中使用了其他模块,也需要在此处添加
🌴 4.2 生成 Makefile
执行 qmake 命令生成 Makefile
bash
/opt/project/qt/bin/qmake
然后检查 Makefile 中的 CC CXX 等参数是否配置正确
🌵 4.3 交叉编译与部署
执行编译
bash
make
完成后赋予 Qt 程序可执行权限
bash
chmod +x MimicHerb
将 Qt 程序传送至单板
bash
scp MimicHerb root@192.168.10.29:/home/
登录单板,并在单板上运行 Qt 程序
bash
ssh root@192.168.10.29
cd /home
./MimicHerb
若屏幕正常显示界面,则 Qt 项目部署成功。
🚫 5. 问题解决
📛 5.1 Qt 源码包 ./configure 配置编译参数时报错
如果你在 ./configure 配置编译参数时出现以下报错信息:

注意观察这里红字的 error 基本上都是 C++ 代码语法上的报错。所以这大概率是你的 C++ 交叉编译器的版本和 Qt 的版本不兼容导致的。
这里编译的是 Qt 5.12.12 的版本,需要用支持 C++ 11 标准的编译器来编译。也就是说至少需要 5.3 版本以上的 c++ 编译器。如果你用低于 5.3 版本的 c++ 交叉编译器去编译就会出现如上图所示的这种报错。
要解决这个问题要么就是升级交叉编译工具链版本,让 c++ 编译器升级到 5.3 以上的版本;要么就是拉低 Qt 版本,让 Qt 版本低于 5.6.3 版本。
🛑 5.2 Qt 项目 make 报错 error: ld returned 1 exit status
如果你在交叉编译 Qt 项目的时候出现以下报错

那么说明你的目录不干净,比如之前 make 过一次没有 make clean。
解决的方法就是把目录里面各种各样的中间过程文件全部删掉,只保留最基本的头文件,源文件,资源文件,重新 qmake,重新 make