i.MX6ULL开发板Qt应用移植与交叉编译指南

发布时间:2026/9/12 17:47:53

i.MX6ULL开发板Qt应用移植与交叉编译指南 1. i.MX6ULL与ELF1开发板概述i.MX6ULL是NXP推出的一款高性能、低功耗的ARM Cortex-A7处理器主频可达900MHz广泛应用于工业控制、智能家居、医疗设备等嵌入式领域。ElfBoard ELF1是基于i.MX6ULL处理器设计的一款开发板具有丰富的外设接口和稳定的性能表现非常适合嵌入式Linux开发和Qt应用程序的移植。ELF1开发板的主要硬件特性包括处理器NXP i.MX6ULL Cortex-A7 900MHz内存256MB DDR3存储8GB eMMC MicroSD卡槽显示接口RGB LCD接口支持800×480分辨率网络10/100M以太网其他接口USB OTG、UART、GPIO、I2C、SPI等2. 开发环境准备2.1 交叉编译工具链安装要在主机上编译运行在ELF1开发板上的Qt应用程序首先需要安装ARM架构的交叉编译工具链。推荐使用Linaro提供的工具链wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz sudo mv gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf /opt/然后添加环境变量到~/.bashrc文件中echo export PATH/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin:$PATH ~/.bashrc source ~/.bashrc验证安装是否成功arm-linux-gnueabihf-gcc --version2.2 Qt开发环境配置ELF1开发板支持Qt 5.12版本我们需要在主机上安装相同版本的Qt SDK下载Qt 5.12.12离线安装包wget https://download.qt.io/archive/qt/5.12/5.12.12/qt-opensource-linux-x64-5.12.12.run给安装文件添加执行权限并运行chmod x qt-opensource-linux-x64-5.12.12.run ./qt-opensource-linux-x64-5.12.12.run安装过程中选择Custom installation确保勾选以下组件Qt 5.12.12 → Qt ChartsQt 5.12.12 → Qt Quick Controls 2Qt 5.12.12 → Qt Serial PortTools → Qt Creator安装完成后打开Qt Creator在工具→选项→Kits中添加交叉编译工具链编译器选择之前安装的arm-linux-gnueabihf-gQt版本需要手动编译Qt库见下一节调试器使用gdb-multiarch3. Qt库的交叉编译3.1 获取Qt源码下载Qt 5.12.12源码包wget https://download.qt.io/archive/qt/5.12/5.12.12/single/qt-everywhere-src-5.12.12.tar.xz tar -xvf qt-everywhere-src-5.12.12.tar.xz cd qt-everywhere-src-5.12.123.2 配置编译选项创建编译配置脚本configure.sh#!/bin/bash ./configure \ -prefix /opt/qt5.12.12-arm \ -release \ -opensource \ -confirm-license \ -make libs \ -xplatform linux-arm-gnueabi-g \ -qt-freetype \ -no-opengl \ -no-pch \ -no-xcb \ -no-eglfs \ -no-gtk \ -no-cups \ -no-iconv \ -no-evdev \ -no-tslib \ -no-icu \ -no-sql-db2 \ -no-sql-ibase \ -no-sql-mysql \ -no-sql-oci \ -no-sql-odbc \ -no-sql-psql \ -no-sql-sqlite2 \ -no-sql-tds \ -qt-sql-sqlite \ -qt-zlib \ -qt-libpng \ -qt-libjpeg \ -nomake examples \ -nomake tests \ -skip qt3d \ -skip qtactiveqt \ -skip qtandroidextras \ -skip qtcanvas3d \ -skip qtcharts \ -skip qtconnectivity \ -skip qtdatavis3d \ -skip qtdeclarative \ -skip qtdoc \ -skip qtgamepad \ -skip qtgraphicaleffects \ -skip qtlocation \ -skip qtmacextras \ -skip qtmultimedia \ -skip qtnetworkauth \ -skip qtpurchasing \ -skip qtquickcontrols \ -skip qtquickcontrols2 \ -skip qtremoteobjects \ -skip qtscript \ -skip qtscxml \ -skip qtsensors \ -skip qtserialbus \ -skip qtserialport \ -skip qtspeech \ -skip qtsvg \ -skip qttools \ -skip qttranslations \ -skip qtvirtualkeyboard \ -skip qtwayland \ -skip qtwebchannel \ -skip qtwebengine \ -skip qtwebglplugin \ -skip qtwebsockets \ -skip qtwebview \ -skip qtwinextras \ -skip qtx11extras \ -skip qtxmlpatterns \ -v3.3 执行编译和安装chmod x configure.sh ./configure.sh make -j$(nproc) sudo make install编译完成后Qt库将安装在/opt/qt5.12.12-arm目录下。这个目录需要添加到Qt Creator的Qt版本中。4. 创建并编译Qt应用程序4.1 创建Qt Widgets Application项目打开Qt Creator选择文件→新建文件或项目→应用程序→Qt Widgets Application设置项目名称和位置在Kit Selection步骤选择之前配置的ARM交叉编译工具链完成项目创建向导4.2 配置项目文件(.pro)确保.pro文件中包含以下配置QT core gui widgets TARGET elf1_qt_app TEMPLATE app # 目标平台设置 target.path /home/root INSTALLS target # 交叉编译设置 QMAKE_CC arm-linux-gnueabihf-gcc QMAKE_CXX arm-linux-gnueabihf-g QMAKE_LINK arm-linux-gnueabihf-g # Qt库路径 QT_INSTALL_PREFIX /opt/qt5.12.12-arm4.3 编写简单界面代码在mainwindow.cpp中添加一个简单的按钮和标签#include mainwindow.h #include ui_mainwindow.h #include QLabel #include QPushButton #include QVBoxLayout MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui-setupUi(this); QWidget *centralWidget new QWidget(this); QVBoxLayout *layout new QVBoxLayout(centralWidget); QLabel *label new QLabel(Hello ELF1!, centralWidget); QPushButton *button new QPushButton(Click Me, centralWidget); layout-addWidget(label); layout-addWidget(button); setCentralWidget(centralWidget); connect(button, QPushButton::clicked, [label](){ label-setText(Button Clicked!); }); } MainWindow::~MainWindow() { delete ui; }4.4 编译项目在Qt Creator中点击构建→构建项目或者使用命令行qmake make编译成功后会在项目目录下生成可执行文件elf1_qt_app。5. 部署和运行Qt应用程序5.1 将应用程序复制到开发板有多种方式可以将编译好的应用程序传输到ELF1开发板使用SCP命令scp elf1_qt_app root开发板IP:/home/root/使用U盘将可执行文件复制到U盘将U盘插入开发板在开发板上挂载U盘并复制文件mkdir /mnt/usb mount /dev/sda1 /mnt/usb cp /mnt/usb/elf1_qt_app /home/root/ chmod x /home/root/elf1_qt_app5.2 设置运行环境在开发板上运行Qt应用程序前需要设置环境变量export QT_QPA_PLATFORMlinuxfb:fb/dev/fb0 export QT_QPA_FONTDIR/usr/share/fonts export LD_LIBRARY_PATH/opt/qt5.12.12-arm/lib:$LD_LIBRARY_PATH可以将这些命令添加到开发板的/etc/profile文件中以便每次启动自动设置。5.3 运行应用程序./elf1_qt_app -qws如果一切正常你应该能在开发板的LCD屏幕上看到带有Hello ELF1!标签和Click Me按钮的窗口。6. 常见问题与解决方案6.1 编译时找不到Qt库错误信息cannot find -lQt5Core解决方案确保.pro文件中正确设置了QT_INSTALL_PREFIX检查交叉编译的Qt库是否安装正确在.pro文件中添加库路径LIBS -L/opt/qt5.12.12-arm/lib6.2 运行时无法连接到显示服务器错误信息Unable to open display解决方案确保设置了正确的QT_QPA_PLATFORM环境变量检查开发板上的framebuffer设备是否存在ls /dev/fb*尝试不同的平台插件export QT_QPA_PLATFORMeglfs # 或者linuxfb, wayland等6.3 应用程序运行缓慢可能原因没有启用硬件加速使用了复杂的图形效果解决方案确保在配置Qt时启用了适当的硬件加速选项简化界面设计避免使用复杂的图形效果考虑使用Qt Quick而不是Qt Widgets因为Quick更适合嵌入式设备6.4 触摸屏不工作解决方案检查触摸屏设备文件ls /dev/input/event*设置正确的环境变量export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS/dev/input/event1:rotate0可能需要重新编译Qt启用tslib支持7. 性能优化技巧7.1 使用静态编译为了减少依赖和提高启动速度可以考虑静态编译Qt应用程序重新配置Qt源码时添加-static选项./configure -static ...重新编译安装Qt库在应用程序的.pro文件中添加CONFIG static7.2 减少Qt模块只包含应用程序实际需要的Qt模块可以显著减少二进制大小和内存占用。在.pro文件中明确指定需要的模块QT core gui widgets # 只包含必要的模块7.3 使用QML代替Widgets对于嵌入式设备Qt Quick (QML)通常比传统的Qt Widgets性能更好创建Qt Quick Application项目使用QML设计界面确保在配置Qt时启用了Qt Quick模块7.4 启用硬件加速如果开发板的GPU支持OpenGL ES可以启用硬件加速配置Qt时添加-opengl es2选项设置正确的平台插件export QT_QPA_PLATFORMeglfs8. 进阶应用开发8.1 添加串口通信功能ELF1开发板具有多个UART接口可以在Qt应用程序中添加串口通信功能在.pro文件中添加serialport模块QT serialport示例代码#include QSerialPort #include QSerialPortInfo // 获取可用串口列表 QListQSerialPortInfo ports QSerialPortInfo::availablePorts(); foreach (const QSerialPortInfo port, ports) { qDebug() Port: port.portName(); } // 打开串口 QSerialPort serial; serial.setPortName(ttymxc1); // ELF1上的UART2 serial.setBaudRate(QSerialPort::Baud115200); if (serial.open(QIODevice::ReadWrite)) { serial.write(Hello UART!\n); serial.waitForBytesWritten(1000); serial.close(); }8.2 使用Qt Charts显示数据确保在配置Qt时启用了qtcharts模块在.pro文件中添加QT charts示例代码#include QtCharts QChartView *chartView new QChartView(this); QChart *chart new QChart(); QSplineSeries *series new QSplineSeries(); for (int i 0; i 10; i) { series-append(i, qrand() % 10); } chart-addSeries(series); chart-createDefaultAxes(); chartView-setChart(chart); setCentralWidget(chartView);8.3 实现网络通信ELF1开发板具有以太网接口可以在Qt中实现网络通信在.pro文件中添加network模块QT networkHTTP客户端示例#include QNetworkAccessManager #include QNetworkRequest #include QNetworkReply QNetworkAccessManager *manager new QNetworkAccessManager(this); connect(manager, QNetworkAccessManager::finished, [](QNetworkReply *reply) { if (reply-error() QNetworkReply::NoError) { qDebug() Response: reply-readAll(); } else { qDebug() Error: reply-errorString(); } reply-deleteLater(); }); QNetworkRequest request(QUrl(http://example.com)); manager-get(request);8.4 使用SQLite数据库在.pro文件中添加sql模块QT sql示例代码#include QSqlDatabase #include QSqlQuery QSqlDatabase db QSqlDatabase::addDatabase(QSQLITE); db.setDatabaseName(/home/root/mydatabase.db); if (db.open()) { QSqlQuery query; query.exec(CREATE TABLE IF NOT EXISTS data (id INTEGER PRIMARY KEY, value TEXT)); query.exec(INSERT INTO data (value) VALUES (Test Data)); db.close(); }
延伸阅读

更多相关文章

2026/9/9 23:29:04

深度工作与大脑仙人模式:技术工作者的高效编程与学习指南

在当今信息爆炸的时代,如何保持专注、进入深度工作状态,成为许多开发者和学习者面临的共同挑战。麻省理工博士 Alex Dekora 提出的“大脑仙人模式”概念,为我们提供了一套科学、系统的深度工作方法论。本文将结合技术工作者的实际场景&#x…

2026/9/10 1:08:14

Ubuntu软件卸载完全指南:从基础到高级技巧

1. Ubuntu软件卸载完全指南 作为一个在Linux环境下摸爬滚打多年的老用户,我深知Ubuntu系统中软件管理的重要性。很多人只关注如何安装软件,却忽略了卸载这个看似简单实则暗藏玄机的操作。今天我们就来彻底剖析Ubuntu下的软件卸载机制,让你成为…

2026/9/11 13:21:14

uBackup部署指南:从源码编译到生产环境安装的完整流程

uBackup部署指南:从源码编译到生产环境安装的完整流程 【免费下载链接】ubackup uBackup implements system backup and recovery functions to help users ensure data integrity and reliability. 项目地址: https://gitcode.com/openeuler/ubackup 前往项…

2026/9/12 17:45:56

C++ 右值引用、移动语义与完美转发:原理剖析

一、先理解左值和右值在深入右值引用之前,必须先理解左值(lvalue)和右值(rvalue)的基本概念。看一个简单例子:int a 10;这里:a 是左值。因为它有名字、有稳定地址,可以反复使用。10…

2026/9/12 17:45:56

C++ 四种显式类型转换深度解析:从 static_cast 到 dynamic_cast 与 RTTI

一、为什么 C 要设计四种显式类型转换?C 语言使用万能括号强制转换 (type)expression,虽然灵活但意图模糊。例如看到 (A*)p,很难判断程序员是想进行数值转换、去掉 const、父类转子类,还是暴力重新解释内存。这降低了代码的可读性…

2026/9/12 17:45:56

WMSST与MCNN-BiGRU融合的工业设备智能故障诊断方案

1. 项目概述在工业设备运维领域,故障诊断技术正经历着从传统方法向智能算法的重要转型。这项研究提出了一种融合WMSST时频分析技术与MCNN-BiGRU深度学习架构的创新诊断方案,通过Matlab平台实现了端到端的故障识别系统。我在实际工业数据集测试中发现&…

2026/9/12 17:45:56

Chrome浏览器整合Gemini 3.1:AI如何重构浏览体验

1. Chrome浏览器迎来AI革命:Gemini 3深度整合解析当我在Chrome地址栏输入chrome://flags准备调试某个网页时,突然发现设置页面多出了"Enable Gemini features"的实验性选项。这个细节揭示了一个重要事实:我们熟悉的浏览器正在经历自…

2026/9/12 17:45:56

三步抓到第一包:用 ProxyPin 跑通跨平台网络调试

三步抓到第一包:用 ProxyPin 跑通跨平台网络调试 【免费下载链接】network_proxy_flutter Open source free capture HTTP(S) traffic software ProxyPin, supporting full platform systems 项目地址: https://gitcode.com/GitHub_Trending/ne/network_proxy_flu…

2026/9/12 2:05:33

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/12 3:55:12

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/12 10:09:03

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介:本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包,聚焦于长鼻浣熊优化算法(COA)的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题,作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/12 14:32:17

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/12 6:37:43

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码