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

发布时间:2026/11/3 13:15:55

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/10/25 17:52:34

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

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

2026/11/2 23:50:32

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

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

2026/11/2 8:15:51

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

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

2026/11/3 13:13:23

漏洞挖掘实战:从扫描器依赖到攻击面建模

1. 项目背景与核心挑战 "挖洞"这个术语在安全测试领域特指漏洞挖掘工作。作为从业十余年的白帽子,我经历过太多投入数百小时却颗粒无收的项目。去年某金融系统的渗透测试中,团队累计投入327人天只发现2个低危漏洞,客户质疑报告价值…

2026/11/3 13:13:23

paperclip 实战:Node.js + React 构建 AI agent 可观测面板

1. 从 paperclip 这个名字说起:它到底想解决什么问题第一次看到paperclip这个项目名,我脑子里蹦出来的画面是那个经典的 Office 助手——一个会跳出来问“需要帮忙吗”的小回形针。但放到 2026 年的技术语境里,这个名字其实挺有意思&#xff…

2026/11/3 13:13:23

Gradle 7.x仓库收口:repositoriesMode三模式与依赖治理

经常看到有团队把 Gradle 从 6.x 拉到 7.x,改完 wrapper、跑一次 sync,屏幕上直接糊出来一行红字:Build was configured to prefer settings repositories over project repositories but repository maven was added by build file app/buil…

2026/11/3 13:13:23

回形针的弹性原理与隐藏技能:从力学到选购一篇讲透

桌上那盒回形针,你大概从来没正眼看过它。它便宜到按斤装、论盒卖,长得也差不多:一段两头弯起来的铁丝。可就是这根铁丝,每年在全球要被用掉几十亿枚。它夹得住两页便利贴,也夹得住一摞报销单;它可以是书签…

2026/11/3 13:13:23

LeetCode 56题:合并区间算法详解与应用

1. 合并区间问题概述 合并区间是LeetCode上经典的数组处理问题,编号为56题,同时也是hot100高频面试题库中的必刷题目。这道题考察的是对区间重叠情况的判断与处理能力,在实际开发中有着广泛的应用场景,比如日程安排系统、会议室预…

2026/11/3 13:08:21

Oracle数据库核心进程与内存结构深度解析

1. 项目概述 "深入理解Oracle数据库核心进程与内存结构"这个题目看似简单,却涵盖了Oracle数据库最核心的架构知识。作为数据库系统原理课程的经典考题,它考察的不仅是概念记忆,更是对数据库运行机制的深刻理解。我在实际DBA工作中发…

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32实战:基于MAX14431数字隔离器的SPI隔离通信方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

工业SPI隔离通信设计:MAX14431BAEE+与STM32L4A6RG实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32+NRF24L01无线抢答器:硬件设计、通信协议与低功耗实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

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

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

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