尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
IMX6ULL车载终端Qt交叉编译与rsync部署实战
简介这是基于NXP i.MX6ULL处理器的智能车载终端项目代码包面向嵌入式开发者和正点原子IMX6ULL开发板用户提供了可直接部署运行的QT图形界面应用涵盖音乐播放、视频播放等车载娱乐功能并针对正点原子出厂系统做了深度适配。压缩包共25个文件总大小约39.19MB其中包含cpp/h源码、o目标文件、Makefile构建脚本以及mp3音乐、mp4和mkv测试视频等资源方便开发者直接编译运行或二次开发。文件内还附有说明文档代码注释详尽、框架兼容性好适合初学者按照教程逐步完成环境配置与功能定制。已有728人学习下载对于想要快速上手IMX6ULL界面开发或完善车载终端项目的开发者来说是一份实操性很强的参考资料。1. 车载终端项目为什么总卡在编译完同步这一步拿到正点原子IMX6ULL开发板把build-QTMenu-IMX6U-rsync-Debug.rar解压出来这个目录名其实已经把完整构建链讲清楚了项目叫QTMenu套件名是IMX6U-rsync构建配置选Debug编译完成后用rsync把产物推到板子。实际跑这个项目时坑大多不在业务代码而在三步交叉编译链不对导致Exec format error、linuxfb屏幕参数跟LCD不一致导致只显示一角、中文字体缺失导致菜单全是方块。下面按构建→同步→适配→调试→自启这条线走一遍把正点原子ALPHA或MINI开发板在出厂系统里跑通一个Qt车载终端每一步都给出可执行的命令和参数。2. 从build-QTMenu-IMX6U-rsync-Debug看Qt交叉编译与rsync部署2.1 构建目录名拆解Debug配置、rsync步骤和IMX6U目标板build-QTMenu-IMX6U-rsync-Debug是Qt Creator自动生成的构建目录命名规则是build-项目名-套件名-构建配置名。拆开看QTMenu是Qt Widgets工程IMX6U-rsync是套件名表示以IMX6ULL为目标板、构建完成后执行rsyncDebug是qmake的构建配置。很多人会忽略后面这个Debug实际上它直接影响板端运行的库依赖调试模式默认带-g符号且不做优化链接的如果是调试版Qt库体积通常比Release大30%~50%。正点原子IMX6ULL的出厂系统内核一般是4.1.15交叉编译工具链和Qt的匹配关系是第一个硬门槛。如果只用Ubuntu的apt装一个qmake编译出来的不是ARM ELFrsync到板子上执行会立刻报Exec format error。我一般会在正点原子资料盘里直接取一套已经编译好的交叉Qt常见组合是arm-linux-gnueabihf-gcc 4.9.4加Qt 5.5.1或5.6.2这套配出厂rootfs几乎不用额外装库。验证方式很直接编译完成后对可执行文件执行file build-QTMenu-IMX6U-rsync-Debug/QTMenu期望输出是ELF 32-bit LSB executable, ARM, EABI5。如果显示成了x86-64说明套件里的qmake配的仍然是宿主Qt需要回到Qt Creator的套件设置里把qmake路径指到交叉Qt的bin/qmake。2.1.1 在Qt Creator的构建步骤里挂一个rsync把rsync直接挂进构建步骤是我在这个项目里推荐的做法。项目设置界面找到构建步骤添加一个自定义过程步骤填入rsync -avz --progress $(BUILDDIR)/ root192.168.1.230:/usr/local/qmenu/$(BUILDDIR)是Qt Creator注入的变量指向当前构建目录。这样每次CtrlB编译通过后自动推送不需要再手动scp。注意target目录/usr/local/qmenu要提前在板端创建且板子的SSH服务要允许root登录否则rsync会卡在认证阶段。2.2 交叉编译链与Qt版本的匹配决定rsync过去能不能运行交叉编译链、Qt版本和板端rootfs三者必须对齐。常见做法是先在Ubuntu里配置好arm-linux-gnueabihf工具链再把正点原子资料里带的那份Qt整个放到例如/opt/qt-imx6ull然后用这份Qt的qmake构建。如果直接用厂家出厂rootfs里的Qt运行库编译时就不要在配置里指定额外的-prefix否则运行时通过qt.conf找不到插件目录启动时立刻报could not find or load the Qt platform plugin linuxfb。qmake和编译器版本不匹配还会产生一个隐蔽问题板端跑起来后在特定界面才偶发崩溃这种崩溃跟代码逻辑无关而是编译时用的libstdc版本比板端新。IMX6ULL上是旧版glibc交叉编译器如果选了过新的gcc 9编译产物在4.1.15内核的rootfs里会报GLIBC_2.27 not found。检查项常见现象解决方向file输出非ARM执行报Exec format error套件qmake换成交叉Qt的qmake板端ldd缺Qt库rsync时漏传库文件把交叉Qt的lib目录整体rsync到板端GLIBC_x.x not found运行即提示缺少符号换与板端glibc匹配的旧gcc插件目录找不到启动报platform plugin找不到设定QT_QPA_PLATFORM_PLUGIN_PATH这张表里的前两项在刚开始做IMX6ULL项目时出现频率最高先把这两条路堵住再谈界面适配。2.3 用rsync同步到开发板的最小命令rsync的优势在增量传输、保留权限、支持断点比每次全量scp实用得多。惯用的同步命令是rsync -avz --progress --partial \ build-QTMenu-IMX6U-rsync-Debug/ \ root192.168.1.230:/usr/local/qmenu/逐项说明-a归档模式递归并保留符号链接、权限和时间戳-v输出每个文件名方便肉眼确认同步进度-z对可执行文件收益不大但对图片和字体资源有效--progress显示每个文件的传输百分比--partial保留中断的未完成文件避免断了之后重传整个文件。车载终端的资源文件可能有几十兆内网里通常十几秒完成。提示首次同步前先在板端执行mkdir -p /usr/local/qmenu并确认/usr/local是rootfs里可写分区。正点原子出厂系统如果开了只读根文件系统rsync写入会报Read-only file system需要先把分区重新挂载为rw。3. QTMenu界面适配IMX6ULL屏幕和触摸的3个关键点3.1 linuxfb平台插件的屏幕尺寸和色深参数IMX6ULL没有GPUQt的eglfs走不通最稳的是linuxfb平台插件。启动QTMenu前设置环境变量export QT_QPA_PLATFORMlinuxfb:fb/dev/fb0:size800x480:mmWidth154:mmHeight86 export QT_QPA_FB_HIDECURSOR1拆开看fb/dev/fb0指定framebuffer设备正点原子板子一般就是fb0size800x480要和LCD实际分辨率一致4.3寸RGB屏是480x272、7寸屏是800x480设置错了会出现界面只占屏幕一角或者图片错位mmWidth和mmHeight是物理尺寸影响触摸坐标换算从屏规格书里取设错会导致点击偏移。还有一个在7寸电容屏上容易忽略的参数是色深。如果屏幕颜色整体发青或者花色先查fb驱动的虚拟分辨率fbset -i /dev/fb0输出里的xres、yres和bits-per-pixel对齐后再启动程序。正点原子7寸屏在出厂系统里通常是RGB565如果程序里用了带alpha的图颜色会偏这种情况就改成linuxfb:fb/dev/fb0:size800x480:depth16。3.1.1 分辨率不匹配的三种典型画面现象原因处理只有左上角一块界面size参数大于实际分辨率改成实际LCD分辨率屏幕显示有横向条纹fb驱动时序和屏规格不符检查uboot里的LCD配置触摸偏移但显示正常mmWidth/mmHeight不对从屏规格书取实际物理尺寸3.2 触摸屏分流evdev直连还是tslib校准正点原子出厂rootfs里常见的情况是tslib和evdev并存。Qt 5在linuxfb下推荐直接用evdev省去tslib校准步骤做法是指定触摸屏设备节点export QT_QPA_PLATFORMlinuxfb:fb/dev/fb0:size800x480 export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS/dev/input/event1设备节点不能靠猜。先看系统识别结果cat /proc/bus/input/devices从输出里找Namegoodix-ts或ft5x06那一行再往下看Handlers里面会写event1这样的节点。如果没有输出触摸设备说明设备树没加载触摸节点先补dts而不是改程序。如果项目是从正点原子老例程移植过来的程序内部通过tslib取坐标那环境变量要换成export TSLIB_TSDEVICE/dev/input/event1 export TSLIB_CALIBFILE/etc/pointercal export QT_QPA_FB_TSLIB1这是两套完全不同的通路混用会出诡异的双击或坐标漂移。判断标准很简单程序里有没有调用ts_open或者链接了-lts没有就按evdev的路线走。3.3 中文显示乱码先查字体而不是locale开发板在屏幕终端里中文乱码但在MobaXterm里正常这个现象经常被误判成编码问题。MobaXterm正常是因为PC端用本地字体渲染板端串口终端乱码则是终端字体或locale问题。对Qt程序来说乱码要换一个排查顺序先查中文字体再查代码编码。fc-list :langzh ls /usr/share/fonts/如果输出为空拷贝一个中文字体进去。常用做法是从正点原子资料或任何可再分发的开源字体里拿DroidSansFallback.ttf放到/usr/share/fonts/truetype/后执行fc-cache -fv。Qt程序这边很多老代码用QTextCodec::setCodecForLocale这套接口在Qt5里已经失效。Qt5内部按UTF-8处理字符串真正要做的是注册中文字体#include QFontDatabase int main(int argc, char *argv[]) { QApplication app(argc, argv); QFontDatabase::addApplicationFont(/usr/share/fonts/truetype/DroidSansFallback.ttf); QFont font(DroidSansFallback); font.setPixelSize(22); app.setFont(font); return app.exec(); }addApplicationFont把ttf读进内存注册为可用字体不需要依赖fontconfig这在裁剪过的rootfs里最保险。用setPixelSize而不是setPointSize因为embedded下DPI不准确按点算字号会忽大忽小。如果界面里的中文字符串来自数据库或串口还要确认这些外部数据本身是UTF-8而不仅仅是画界面时用UTF-8。4. IMX6ULL上Debug版本车载终端的调试手法4.1 区分debug库和release库rsync时会遇到的大小与兼容性问题Qt Creator里选Debug配置时CONFIG debug会写入Makefile编译带-g符号qDebug输出也会保留。直接后果是板端运行目录里会多出体积较大的调试版Qt库比如libQt5Widgets.so.5比release版本大不少。对于存储紧张的板子我一般只把项目可执行文件以Debug态部署Qt运行库用release版本两者兼容性没问题前提是编译时的版本号完全一致。混用不同小版本的Qt库常见报错是启动时undefined symbol。确认板端动态库依赖最直接的办法是执行lddcd /usr/local/qmenu ldd ./QTMenu | grep not found有not found就说明rsync时漏了库或者LD_LIBRARY_PATH没包含库目录。正点原子出厂rootfs里如果本身就带Qt库检查路径是否一致如果是自己放到/usr/local/qmenu/lib启动前加export LD_LIBRARY_PATH/usr/local/qmenu/lib:$LD_LIBRARY_PATH。交叉工具链里的readelf可以直接对ARM ELF执行比在板子上跑ldd更早发现问题arm-linux-gnueabihf-readelf -d QTMenu | grep NEEDEDreadelf -d列出的NEEDED条目就是程序运行时的真实依赖列表不能按PC上x86 Qt库的名字去匹配。4.2 把QDebug输出重定向成文件远程调试不依赖串口Debug版本开着qDebug但板子不接串口时输出会全部丢失。两个办法一个是shell层面重定向./QTMenu /var/log/qmenu.log 21 这种方式最简单缺点是多线程程序里qDebug和stdout混写可能乱序。更稳的是用qInstallMessageHandler在程序内统一接管#include QFile #include QTextStream #include QDateTime void logHandler(QtMsgType type, const QMessageLogContext ctx, const QString msg) { QFile out(/var/log/qmenu.log); if (out.open(QIODevice::WriteOnly | QIODevice::Append)) { QTextStream ts(out); ts QDateTime::currentDateTime().toString(yyyy-MM-dd hh:mm:ss) [ msg ] ctx.file : ctx.line \n; } } int main(int argc, char *argv[]) { qInstallMessageHandler(logHandler); QApplication app(argc, argv); // 后续初始化代码 }qInstallMessageHandler在main函数最前面调用程序一启动就把所有qDebug、qWarning、qCritical收进文件。ctx.file和ctx.line只有在编译带-g时才有内容这也是Debug版本做设备端日志分析更有优势的原因。4.3 rsync同步后的运行时错误排查顺序rsync同步完成、运行却报错时按顺序检查这三项能省很多时间。第一项权限位。rsync -a保留的是源码目录权限如果Qt Creator构建产物是当前用户写的板端rootfs里权限可能是644或755。可执行文件必须是755否则报Permission deniedchmod x /usr/local/qmenu/QTMenu第二项动态链接器路径。嵌入式上最常见的No such file or directory报错并不代表文件不存在而是/lib/ld-linux-armhf.so.3找不到程序依赖的某个库。kernel在execve时交给动态链接器去解析路径不对就会给出这个误导性报错。用4.1里的readelf -d确认SONAME再到板端逐一ls验证。第三项Qt插件目录。程序起来后如果先报could not find or load the Qt platform plugin大概率是QT_QPA_PLATFORM_PLUGIN_PATH没指向板端插件目录。正点原子rootfs里常见路径是/usr/lib/arm-linux-gnueabihf/qt5/plugins/platforms保险做法是在启动脚本里显式指定export QT_QPA_PLATFORM_PLUGIN_PATH/usr/lib/arm-linux-gnueabihf/qt5/plugins提示排查rsync同步后的问题先看板端stderr或日志文件不要反复在PC端改代码。绝大多数同步类问题板端至少会留一句有效报错。5. IMX6ULL上QTMenu的开机自启与脚本瘦身5.1 把环境变量写进启动脚本而不是反复export调试阶段一条条export很方便但部署阶段这些变量要在每次开机时都生效而且参数需要固定版本。常见做法是写一个/usr/local/qmenu/start_qmenu.sh把屏幕参数、触摸节点、插件路径和库路径全部固化#!/bin/sh export QT_QPA_PLATFORMlinuxfb:fb/dev/fb0:size800x480:depth16 export QT_QPA_FB_HIDECURSOR1 export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS/dev/input/event1 export QT_QPA_PLATFORM_PLUGIN_PATH/usr/lib/arm-linux-gnueabihf/qt5/plugins export LD_LIBRARY_PATH/usr/local/qmenu/lib:$LD_LIBRARY_PATH cd /usr/local/qmenu exec ./QTMenuexec替换当前shell进程这样QTMenu退出时systemd能直接拿到退出码而不是多包一层sh进程。另一个细节LinuxFB下depth16和屏驱动一致时绘图效率比默认格式高这个参数留在启动脚本里后续换屏时只需改这一行。5.2 systemd服务带来开机自启和崩溃拉起正点原子IMX6ULL的出厂文件系统里buildroot或yocto体系都带了systemd。新建/etc/systemd/system/qmenu.service[Unit] DescriptionQTMenu for IMX6ULL Aftermulti-user.target [Service] ExecStart/usr/local/qmenu/start_qmenu.sh Restartalways RestartSec3 [Install] WantedBymulti-user.targetRestartalways让QTMenu因为任何原因退出后自动重新拉起RestartSec3给系统留出清理framebuffer的时间。配好之后依次执行systemctl daemon-reload systemctl enable qmenu systemctl start qmenu systemctl status qmenustatus会显示Active状态和最近日志查看详细日志用journalctl -u qmenu -n 50。这套流程调试完一次以后每次rsync更新后只需要systemctl restart qmenu。验证开机自启是否生效可以reboot后直接执行systemctl is-active qmenu返回active即为正常拉起。本文还有配套的精品资源点击获取
RELATED

相关推荐

C# Open XML批量生成Word审批表实战

C# Open XML批量生成Word审批表实战

简介:本资源是一套基于C#开发的干部任免审批表批量转Word格式的完整源码解决方案,面向党政机关、事业单位及国企HR或信息化岗位的技术人员,解决人工逐份导出Word效率低、格式不统一、易出错等办公痛点。压缩包共24个文件,含10个核…

📅 2026/9/16 16:03:50
COCO数据集文件缺失补全:工程化校验与修复指南

COCO数据集文件缺失补全:工程化校验与修复指南

1. 为什么COCO数据集“缺文件”不是Bug,而是常态性工程现实COCO数据集缺失文件补全方法——这标题乍看像在修一个bug,实则直指计算机视觉领域最常被回避、却每天都在真实发生的工程现场。我带过三届CV方向的实习生,几乎每人第一次跑通Mask R-…

📅 2026/9/16 16:03:50
MCP Registry 生态系统愿景:以 server.json 为核心的元注册表设计——官方注册表、社区子注册表与多生态包体系

MCP Registry 生态系统愿景:以 server.json 为核心的元注册表设计——官方注册表、社区子注册表与多生态包体系

MCP Registry 生态系统愿景:以 server.json 为核心的元注册表设计——官方注册表、社区子注册表与多生态包体系 【免费下载链接】registry A community driven registry service for Model Context Protocol (MCP) servers. 项目地址: https://gitcode.com/GitHub…

📅 2026/9/16 16:03:50
MORE NEWS

更多资讯

📰

在 Linux 上使用 rbenv 安装与管理 Ruby:完整安装指南

在 Linux 上使用 rbenv 安装与管理 Ruby:完整安装指南 【免费下载链接】curriculum The open curriculum for learning web development 项目地址: https://gitcode.com/GitHub_Trending/cu/curriculum 本文档对应 The Odin Project 开源课程(本仓…

📰

Rekor 可插拔类型(Pluggable Types)机制深度解析:透明日志条目 Schema 插件体系与 BuildKit 中的落地实践

Rekor 可插拔类型(Pluggable Types)机制深度解析:透明日志条目 Schema 插件体系与 BuildKit 中的落地实践 【免费下载链接】buildkit concurrent, cache-efficient, and Dockerfile-agnostic builder toolkit 项目地址: https://gitcode.co…

📰

长沙市POI数据处理实战:从7z解压到DEM叠加分析

简介:一份面向GIS分析、城市规划、商业选址与交通研究人员的长沙市2020年POI数据集包,内含30米分辨率DEM数字高程模型、长沙市区县/街道等行政区划边界,以及shp和Excel两种格式的兴趣点数据。POI覆盖餐饮、购物、医疗保健、政府机构、住宿服务…

📰

C++实现结构光激光中心线亚像素提取

简介:本资源是一套基于C实现的线结构光视觉传感器标定核心代码,面向机器视觉、工业检测及光学测量方向的研究生与工程师,聚焦激光光条中心线的高精度提取问题。项目完整实现了多格式图像解码(BMP/JPG/PCX/GIF)、大津法…

📰

Carbon Web Components 的 `cds-code-snippet` 渲染原理与快照测试深度解析

Carbon Web Components 的 cds-code-snippet 渲染原理与快照测试深度解析 【免费下载链接】carbon A design system built by IBM 项目地址: https://gitcode.com/GitHub_Trending/carbo/carbon 导读 cds-code-snippet 是 IBM Carbon Design System 在 Web Components …

📰

mlx-audio 中的 Dramabox 语音合成:基于 LTX DiT + Gemma 编码器的 48 kHz 立体声 TTS 与参考音频克隆实现

mlx-audio 中的 Dramabox 语音合成:基于 LTX DiT Gemma 编码器的 48 kHz 立体声 TTS 与参考音频克隆实现 【免费下载链接】mlx-audio A text-to-speech (TTS), speech-to-text (STT) and speech-to-speech (STS) library built on Apples MLX framework, providing…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬