2. 嵌入式Linux与Qt概述

好,咱们正式开始动手了。上一章聊了嵌入式Qt的整体架构,这一章咱们把吃饭的家伙——Qt Creator——装好、配好,然后跑通第一个嵌入式程序。

说实话,我见过不少新手在安装配置这一步就卡住了。不是装错版本,就是Kit死活配不上。别急,跟着我的节奏来,保证你半小时内看到界面跑起来。

2.1 Qt Creator的安装与版本选择

先解决一个核心问题:到底该装哪个版本?

版本系列 适用场景 我的建议
Qt 5.12 LTS 工业产品、长期维护项目 最稳,我项目里用了三年没出过妖
Qt 5.15 LTS 需要较新特性但求稳定 折中选择,社区资源丰富
Qt 6.x 新项目、桌面为主 嵌入式支持还在完善,先观望

我个人习惯用 Qt 5.12.12 搭配 Qt Creator 4.14。为什么?这个组合在ARM板子上踩过的坑最少,交叉编译工具链的兼容性也最好。

安装小贴士: 下载时选 qt-opensource-linux-x64-5.12.12.run,安装过程中记得勾选「Sources」和「Qt Charts」——我吃过亏,没装Sources后面调试符号都看不到。

2.2 安装步骤(Ubuntu 20.04为例)

步骤其实很简单,但有几个坑我得提前告诉你。

  1. 安装依赖库
    sudo apt-get install build-essential libgl1-mesa-dev libfontconfig1-dev libfreetype6-dev libx11-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libx11-xcb-dev libxcb-glx0-dev
  2. 运行安装包
    chmod +x qt-opensource-linux-x64-5.12.12.run
    ./qt-opensource-linux-x64-5.12.12.run
  3. 配置安装路径 —— 我建议装到 /opt/Qt5.12.12,别用默认的home目录,后面交叉编译时路径太长容易出问题。
  4. 选择组件 —— 嵌入式开发必选:
    • Desktop gcc 64-bit
    • Sources
    • Qt Charts(画曲线图用)
    • Qt Serial Port(串口通信)
注意: 千万别勾选「Qt WebEngine」—— 嵌入式板子上跑不动,而且编译时间能让你等到怀疑人生。

2.3 Kits管理——最容易被忽视的关键环节

Kit是什么?说白了就是「编译器 + 设备类型 + Qt版本」的三件套。你配不好Kit,Qt Creator就不知道拿什么工具去编译你的代码。

打开Qt Creator,进入 Tools → Options → Kits,你会看到这个界面:

Qt Creator Kits 配置结构图 Kit 三要素 ① 编译器 (Compiler) ② Qt 版本 (Qt Version) ③ 设备类型 (Device Type) Kit 实例 ARM-5.12.12 交叉编译 Kit → 生成 ARM 可执行文件 输出产物 ARM 二进制 .so 动态库 部署到板子 💡 配置要点 • 交叉编译器路径必须与 Qt 库的架构匹配(arm-linux-gnueabihf-g++) • 每个 Kit 只能绑定一个 Qt 版本,但可以绑定多个编译器 • 调试器建议用 gdb-multiarch,不要用默认的 gdb

2.3.1 配置交叉编译Kit

嵌入式开发的核心就是交叉编译。你在PC上写代码,编译出ARM架构的二进制,然后丢到板子上跑。

配置步骤:

  1. 添加编译器:点击「Compilers」→「Add」→「GCC」,选择你的交叉编译器路径,比如:
    /usr/bin/arm-linux-gnueabihf-g++
  2. 添加Qt版本:点击「Qt Versions」→「Add」,定位到交叉编译版的qmake:
    /opt/Qt5.12.12/5.12.12/gcc_arm/bin/qmake
  3. 新建Kit:点击「Kits」→「Add」,把上面两个关联起来,设备类型选「Generic Linux Device」。
我曾经踩过的坑: 第一次配Kit时,我直接把PC版的qmake绑进去了。编译通过,但板子上一跑就Segmentation Fault。折腾了两天才发现——PC的qmake生成的是x86指令,ARM CPU根本不认识。所以一定要确认qmake来自交叉编译工具链。

2.4 第一个嵌入式Qt程序

Kit配好了,咱们来写个最简单的程序验证一下。别搞复杂,就一个窗口,显示「Hello 嵌入式Qt」。

2.4.1 创建项目

  1. 点击「New Project」→「Application」→「Qt Widgets Application」
  2. 项目名称:HelloEmbedded,路径别带中文和空格
  3. 构建系统选 qmake(cmake在嵌入式上坑多)
  4. Kit选择刚才配好的交叉编译Kit

2.4.2 编写代码

Qt Creator自动生成了main.cpp,咱们改一下:

#include <QApplication>
#include <QLabel>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QLabel label("Hello 嵌入式Qt!");
    label.setAlignment(Qt::AlignCenter);
    label.setStyleSheet("font-size: 32px; color: #2c3e50;");
    label.resize(400, 300);
    label.show();

    return app.exec();
}

代码很简单,对吧?但这里有个细节——嵌入式板子通常没有桌面环境,所以你不能依赖窗口管理器。Qt程序需要自己处理显示。

2.4.3 编译与部署

点击左下角的「Build」按钮(小锤子图标),选择交叉编译Kit。编译成功后,你会看到:

HelloEmbedded 可执行文件(约 1.2MB)

怎么部署到板子上?我一般用scp:

scp HelloEmbedded root@192.168.1.100:/root/

然后SSH到板子上运行:

ssh root@192.168.1.100
export DISPLAY=:0
./HelloEmbedded
提示: 如果板子上没有显示输出,检查一下 export QT_QPA_PLATFORM=linuxfb 或者 eglfs。我习惯用 linuxfb,兼容性最好。

2.5 常见问题与避坑指南

问题现象 原因 解决办法
编译报错:找不到GL/gl.h 缺少OpenGL开发库 sudo apt install libgl1-mesa-dev
板子上运行报错:libQt5Core.so.5 not found Qt库没部署到板子 把交叉编译的lib目录整个拷贝到板子的/usr/lib
界面显示为黑屏 没有设置显示平台插件 export QT_QPA_PLATFORM=linuxfb
触摸没反应 tslib未配置或未安装 交叉编译tslib并设置TSLIB_*环境变量
重要提醒: 交叉编译的Qt库版本必须和板子上的库版本完全一致。我见过有人把5.12的库和5.9的混用,结果程序启动就崩。记住:编译环境 = 运行环境,版本号一个字符都不能差。

2.6 小结

这一章咱们把Qt Creator装好了,Kit配通了,第一个程序也跑起来了。你想想看,从零到看到「Hello 嵌入式Qt」出现在板子屏幕上,其实就三步:装软件、配Kit、写代码。

嗯,这里我要强调一句:Kit配置是嵌入式Qt开发的门槛。你后面写再多代码,如果Kit没配对,一切都是白搭。我建议你把配好的Kit截图保存,或者写个文档记录路径,下次换电脑或者换板子时直接复用。