1. 为什么要在开发板上跑Qt先聊聊我的踩坑经历很多朋友从单片机转向Linux开发板比如正点原子的Alpha或者STM32MP157系列第一感觉就是“头大”。以前在Keil里点一下编译用ST-Link一烧录程序就跑起来了简单直接。现在呢动辄几十个G的Ubuntu镜像满屏幕看不懂的终端命令还有“交叉编译工具链”这种听起来就很高深的名词直接就把人劝退了。我刚开始也是这个状态感觉面前挡着一座大山。但后来我想通了其实我们没必要一开始就搞懂所有东西。就像学开车你不用先成为汽车工程师只要知道怎么踩油门、打方向就能把车开动起来。在Linux开发板上跑Qt程序也是同样的道理。Qt是一个做图形界面的强大工具你写的程序可以在Windows、Mac、Linux电脑上运行当然也能在ARM架构的开发板上运行。我们今天要做的就是打通从你写的代码到开发板屏幕显示这“最后一公里”。这个过程的核心其实就解决一个问题你电脑通常是x86架构的CPU编译出来的程序怎么让开发板ARM架构的CPU能认识并执行答案就是需要一个“翻译官”这个“翻译官”就是交叉编译工具链。别被这个名字吓到你就把它想象成一个特殊的编译器它住在你的Ubuntu系统里但专门生产ARM能听懂的可执行文件。我们今天的全程就是安装这个“翻译官”然后让它帮我们干活。所以别怕。跟着我的步骤咱们不求甚解先追求“跑通”。等你亲眼看到自己写的按钮在开发板屏幕上亮起来那种成就感会瞬间冲散所有的畏难情绪。我们开始吧。2. 准备工作搭建你的“开发车间”工欲善其事必先利其器。在开始写代码、编译之前我们需要把工作环境搭建好。这里我强烈推荐一条“捷径”能帮你避开很多初学者的坑。2.1 获取“开箱即用”的Ubuntu虚拟机镜像正点原子官方非常贴心他们提供了一个已经配置好部分环境的Ubuntu虚拟机镜像。这意味着你不需要从零安装一个纯净版Ubuntu再自己去装Qt Creator、配置各种库那过程对新手来说太折磨了。操作步骤找到你的开发板资料光盘通常是A盘或B盘在其中的“开发工具”或“虚拟机镜像”文件夹里寻找一个名为正点原子Ubuntu镜像.7z或类似名称的压缩包。如果资料是网盘形式就在对应目录下找。将这个庞大的压缩包下载到你的Windows电脑上。关键点来了一定要确保网络稳定下载完成后核对一下文件大小是否完整。因为镜像文件很大网络中断可能导致文件损坏解压时会报错。使用解压软件如7-Zip将其解压到一个剩余空间充足建议至少50GB的硬盘分区。解压后会得到一个或多个.vmdk后缀的虚拟机磁盘文件。打开你的VMware Workstation建议使用15.x或以上版本选择“打开虚拟机”找到刚才解压出来的.vmx配置文件打开它。首次启动虚拟机时VMware可能会提示“你已移动或复制此虚拟机”这里一定要选择“我已复制该虚拟机”这很重要能避免网络配置冲突。启动后你会进入Ubuntu桌面。这个镜像通常已经设置好了中文环境桌面也预装了一些工具。用户名和密码通常是root和root或者alientek和alientek具体看原子哥的文档说明。用这个镜像我们跳过了最繁琐的系统配置环节直接获得了能用的开发环境。2.2 认识你的“工作台”Qt Creator在Ubuntu桌面你可能找不到Qt Creator的图标。别急它已经装好了。点击屏幕左侧任务栏最上方的“显示应用程序”通常是9个点的图标或者使用搜索功能Ubuntu 18.04是屏幕左上角的“Activities”输入qt creator。打开Qt Creator后你会看到一个欢迎界面。这里我建议先不用管它我们暂时不在这里创建新工程。因为正点原子的例程源码已经给我们准备好了。通常镜像里会在家目录/home/alientek/下放置一个qt_demo或类似的文件夹里面就是各种Qt例程。我们接下来的操作会先在这里“体验”一下编译和运行找找感觉。3. 初体验在电脑上“仿真”你的Qt程序在真正为开发板编译之前我们先在Ubuntu本身也就是x86平台上编译并运行一下Qt程序。这相当于STM32开发中的“软件仿真”目的是快速验证我们的代码逻辑和界面效果是否正确。3.1 打开并运行一个现成例程我们找一个简单的例程比如04_qpushbutton一个控制窗口背景色切换的例子。在Qt Creator中点击文件-打开文件或项目。导航到~/qt_demo/04_qpushbutton目录选择04_qpushbutton.pro文件这是Qt的工程文件。打开后左下角你会看到有调试小甲虫和运行绿色三角的按钮。直接点击绿色三角。稍等片刻一个带有几个按钮的小窗口就会弹出来。点击按钮窗口背景色会随之改变。恭喜你你的第一个Qt程序在PC上跑起来了这个步骤的意义在于它让你立刻获得正反馈。你能看到图形界面能与它交互明白我们最终要做出个什么东西。编译生成的可执行文件默认在工程目录的同级一个叫build-xxxxx-Desktop_Qt...的文件夹里。你可以去找到它直接双击也能运行。3.2 理解“平台”的差异为什么电脑能跑开发板不行现在我们来做一个关键检查。打开终端进入那个可执行文件所在的目录输入命令file 04_qpushbutton你会看到输出信息里包含ELF 64-bit LSB executable, x86-64。这告诉我们这个程序是给x86-64架构也就是我们常用的Intel/AMD电脑CPU使用的。而我们的正点原子开发板无论是I.MX6ULL还是STM32MP157CPU都是ARM架构。一个为x86编译的程序ARM CPU根本不认识它的指令集。这就好比一份中文说明书拿给一个只懂英文的人看他完全没法理解。所以我们需要一个能为ARM架构生成“说明书”可执行文件的编译器也就是接下来要请出的“主角”。4. 核心步骤请来“翻译官”——交叉编译工具链这是整个流程中最关键但也是最容易让新手困惑的一步。我们一步步来把它掰开揉碎讲清楚。4.1 获取并安装工具链正点原子提供了专门的工具链来编译Qt程序。它通常在你的资料光盘A盘 - 5、开发工具 - 1、交叉编译器路径下文件名可能像fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.1.0.sh针对I.MX6U或st-example-image-qtwayland-openstlinux-weston-stm32mp1-x86_64-toolchain-3.1-snapshot.sh针对STM32MP157。名字很长别怕我们叫它“工具链脚本”就行。第一步把脚本文件弄到Ubuntu里。我推荐用VMware的“共享文件夹”功能这是最方便的方法。在Windows上随便找个地方新建一个文件夹比如D:\share_with_ubuntu。在VMware中确保你的Ubuntu虚拟机处于关机状态。点击虚拟机设置 -选项-共享文件夹选择“总是启用”然后添加你刚才在Windows上创建的文件夹。启动Ubuntu这个共享文件夹通常会被自动挂载在/mnt/hgfs/目录下。进去就能看到你Windows文件夹里的内容了。把那个长长的.sh工具链脚本文件从资料光盘复制到Windows的共享文件夹它在Ubuntu里就能立刻访问到。第二步安装工具链。在Ubuntu中打开终端进入共享文件夹目录cd /mnt/hgfs/share_with_ubuntu。给脚本加上可执行权限chmod x ./你的工具链脚本名字.sh。执行安装sudo ./你的工具链脚本名字.sh。安装过程中它会问你要安装到哪个目录直接按回车使用默认的/opt/目录下的路径就行。然后静静等待安装完成这个过程可能会花几分钟。安装完成后这个“翻译官”就静静地躺在/opt/目录下的某个文件夹里了。但我们现在还不能直接用需要告诉系统“喂我请了这位翻译官以后编译的话就找他”。4.2 设置环境变量给“翻译官”发个工作证“环境变量”听起来很抽象其实你可以把它理解为系统通讯录里的一个快捷方式。没有设置环境变量时你想调用这个工具链每次都得输入一长串绝对路径比如/opt/fsl/.../bin/arm-poky-linux-gnueabi-gcc太麻烦了。设置环境变量就等于在系统里登记“以后只要我输入arm-poky-linux-gnueabi-gcc你就自动去那个很长的路径下找这个程序”。设置方法很简单工具链安装好后一般会提供一个“环境设置脚本”。我们在终端里执行它source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi注意这个路径要根据你实际安装的工具链路径来修改正点原子的文档里会写清楚。执行这条命令后只是在你当前这个终端窗口里生效了。如果你关了终端再开一个新的需要重新执行一次这条命令。怎么验证是否设置成功呢输入env | grep arm看看如果出现一大堆以ARM、CROSS_COMPILE等开头的变量就说明成功了。现在这个终端窗口就具备了为ARM编译代码的能力。5. 施展魔法为开发板编译Qt程序环境准备好了现在开始真正的编译。我们回到之前那个04_qpushbutton的源代码目录。5.1 使用命令行编译打开终端务必先执行上一步的source ...命令设置好环境变量。使用cd命令进入~/qt_demo/04_qpushbutton目录。执行qmake命令。这个命令会根据04_qpushbutton.pro工程文件生成一个名为Makefile的编译指导文件。如果成功除了可能有一些警告不会有太多输出。执行make命令。这是真正开始编译的命令编译器会读取Makefile调用我们刚刚设置好的交叉编译工具链将C源代码编译、链接成ARM平台的可执行文件。如果一切顺利你会看到一串编译信息滚动最后完成。编译完成后可执行文件就生成在当前的源代码目录下名字应该就是04_qpushbutton没有后缀。我们再次用file命令检查一下file 04_qpushbutton这次输出信息里应该包含了ARM、ELF 32-bit LSB executable等字样。这说明我们成功得到了一个ARM开发板能认识的程序你可以试着在Ubuntu里双击它会发现它毫无反应这就对了因为它不是给x86平台用的。5.2 理解qmake和make的作用这里简单解释一下你可以把qmake理解为项目的“架构师”或“制图员”。它分析你的Qt工程文件.pro里面列出了需要哪些源文件、哪些Qt库、怎么链接等等然后画出一张详细的“施工图纸”这就是Makefile。而make命令则是“施工队队长”。它拿着Makefile这张图纸指挥着“交叉编译工具链”这个施工队包括编译器g、链接器ld等一步步地把源代码砖瓦构建成最终的可执行文件房子。6. 最后一步让程序在开发板上“活”起来编译出的ARM程序怎么放到开发板上运行呢方法有很多比如NFS网络挂载、TFTP下载等。但对于第一次尝试的朋友我推荐最直观的U盘拷贝法。6.1 将程序拷贝到U盘将U盘插入你运行Ubuntu的电脑主机注意是物理主机不是虚拟机。在VMware界面点击右下角的U盘图标选择“连接断开与主机的连接”将U盘挂载到Ubuntu虚拟机内。在Ubuntu中U盘通常会自动挂载在/media/用户名/目录下。找到它把我们刚编译好的04_qpushbutton文件复制进去。复制完成后在VMware中点击U盘图标选择“断开连接”将U盘还给Windows系统。6.2 在开发板上挂载U盘并运行用USB转串口线连接开发板的调试串口到你的Windows电脑用PuTTY、MobaXterm或正点原子常用的串口助手如SecureCRT打开对应串口波特率设为115200。给开发板上电在串口终端里你会看到启动日志。启动完成后会进入命令行登录界面输入root用户登录。将U盘插入开发板的USB Host接口。在串口终端里你需要手动挂载U盘。首先输入dmesg | tail查看内核日志找到U盘被识别为什么设备通常是/dev/sda1或/dev/sdb1。创建一个挂载点并挂载U盘mkdir -p /mnt/myusb # 创建挂载目录 mount -t vfat /dev/sda1 /mnt/myusb # 挂载U盘如果是sdb1就替换掉如果U盘是FAT32格式-t vfat参数是合适的。进入挂载目录并运行程序cd /mnt/myusb ./04_qpushbutton -platform linuxfb -platform linuxfb是指定使用Linux的Framebuffer帧缓冲来显示这是嵌入式Qt常用的选项。符号是让程序在后台运行这样你就不必开两个终端。激动人心的时刻到了此时你应该能看到开发板的屏幕上出现了那个熟悉的按钮窗口点击屏幕上的按钮背景色同样会变化。至此你完成了从零到一在正点原子Linux开发板上部署Qt应用的全过程6.3 可能遇到的问题与解决思路串口无输出检查串口号、波特率、USB线连接以及串口软件配置。U盘挂载失败确认设备节点/dev/sda1检查U盘格式尝试mount -t auto自动检测。运行程序报错“找不到库”或“无法执行二进制文件”最常见的原因是你编译程序时使用的工具链与开发板当前运行的文件系统里的Qt库版本不匹配。确保你使用的是正点原子出厂系统或配套文件系统并且使用了资料里提供的对应工具链。这是最需要保持一致的环节。程序运行但屏幕没显示可能是当前开发板自带的Qt桌面应用占用了显示层。可以先尝试停止出厂桌面服务比如对于某些系统命令是systemctl stop atk-qtapp-start.service然后再运行你的程序。第一次成功之后你可以尝试修改例程里的代码比如改个按钮文字、换个颜色再重新编译、拷贝、运行体验完整的开发循环。这个过程里遇到的每一个错误都是你理解嵌入式Linux开发的好机会。别担心踩坑我当初也是这么一步步过来的每解决一个问题你对整个系统的理解就加深一层。