⚡ arm 32位嵌入式 Linux 系统移植 QT 程序

🧶 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

相关推荐
hkhkhkhkh12320 小时前
Linux设备节点基础知识
linux·服务器·驱动开发
HZero.chen21 小时前
Linux字符串处理
linux·string
张童瑶21 小时前
Linux SSH隧道代理转发及多层转发
linux·运维·ssh
汪汪队立大功12321 小时前
什么是SELinux
linux
石小千21 小时前
Linux安装OpenProject
linux·运维
柏木乃一21 小时前
进程(2)进程概念与基本操作
linux·服务器·开发语言·性能优化·shell·进程
Lime-309021 小时前
制作Ubuntu 24.04-GPU服务器测试系统盘
linux·运维·ubuntu
百年渔翁_肯肯1 天前
Linux 与 Unix 的核心区别(清晰对比版)
linux·运维·unix
胡闹541 天前
Linux查询防火墙放过的端口并额外增加需要通过的端口命令
linux·运维·windows
lc9991021 天前
简洁高效的相机预览
android·linux