⚡ 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

相关推荐
骄傲的心别枯萎3 小时前
项目1:FFMPEG推流器讲解(二):FFMPEG输出模块初始化
linux·ffmpeg·音视频·视频编解码·rv1126
Nimsolax3 小时前
Linux网络应用层自定义协议与序列化
linux·网络
菜鸡爱玩3 小时前
Qt3D--箭头示例
c++·qt
掘根3 小时前
【Qt】多线程
java·开发语言·qt
egoist20233 小时前
[linux仓库]图解System V共享内存:从shmget到内存映射的完整指南
linux·开发语言·共享内存·system v
葵花日记3 小时前
LINUX——进度条
linux·运维·服务器
兰亭妙微3 小时前
兰亭妙微QT软件开发与UI设计协同:如何避免设计与实现脱节?
开发语言·qt·ui
hmcjn(小何同学)4 小时前
轻松Linux-10.进程信号
linux·运维·服务器
用户31187945592184 小时前
libopenssl1_0_0-1.0.2p-3.49.1.x86_64安装教程(RPM包手动安装步骤+依赖解决附安装包下载)
linux