在Linux主机上用QtCreator做嵌入式开发,核心思路是让IDE调用交叉编译工具链生成能在目标板运行的程序,再通过远程方式部署和调试。这和普通桌面Qt开发最大的区别是构建环境不再是你当前系统的原生gcc,而是面向ARM、MIPS等架构的跨平台编译器。

一、准备交叉编译工具链与Qt库
嵌入式开发的第一步是在Linux开发机上安装交叉编译器。以常见的ARM32开发板为例,Ubuntu或Debian系可以直接用包管理器安装arm-linux-gnueabihf系列工具:
sudo apt update sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf arm-linux-gnueabihf-gcc --version
上面命令装好的编译器前缀是arm-linux-gnueabihf-,后续QtCreator里填编译器路径时就要指向/usr/bin/arm-linux-gnueabihf-g++。如果你用的开发板厂商提供了专属工具链,请优先用厂商包,避免glibc版本不匹配。
装完编译器后,还需要编译目标平台的Qt库。不能拿主机Qt库去链嵌入式程序,因为主机库是x86的。通常下载Qt源码后这样配置:
./configure -prefix /opt/qt5-arm -opensource -confirm-license -xplatform linux-arm-gnueabihf-g++ -no-opengl -nomake examples make -j$(nproc) sudo make install
编译完成后,/opt/qt5-arm里就有针对ARM的qmake。这个qmake是后面QtCreator“Qt版本”配置的关键。若板子有特定的sysroot,配置时要加-sysroot参数指向板子根文件系统,确保头文件和库路径正确。
二、在QtCreator中配置编译器和Qt版本
打开QtCreator,进入“工具-选项-设备”,先添加嵌入式设备,类型选“通用Linux设备”,填好开发板IP、用户名和密码,点击“测试”能通过就说明SSH通了。设备配置好后再去“Kits(构建套件)”页面。
工具 -> 选项 -> Kits
编译器: 添加 GCC -> C: /usr/bin/arm-linux-gnueabihf-gcc
-> C++: /usr/bin/arm-linux-gnueabihf-g++
Qt版本: 添加 -> qmake路径: /opt/qt5-arm/bin/qmake
调试器: 添加 -> /usr/bin/arm-linux-gnueabihf-gdb
构建套件: 名称填 ARM-Board
设备类型: 通用Linux设备
设备: 选刚建好的板子
编译器/Qt版本/调试器对应选上面项
这里最容易出错的是Qt版本检测。如果添加qmake后QtCreator报“无法识别的Qt版本”,一般是该qmake对应的Qt库是用不同主版本源码编的,或者环境变量里LD_LIBRARY_PATH干扰了qmake运行。可以在终端先直接跑一遍/opt/qt5-arm/bin/qmake -query看输出是否正常。
构建套件里的sysroot建议填开发板根文件系统目录,比如用NFS挂载的/opt/rootfs。这样链接阶段找库会更准。配置完套件,新建项目时就能在“构建套件”里看到ARM-Board,选它即是交叉构建。
三、编写测试程序并远程部署运行
新建一个Qt Widgets应用,在.pro文件里不需要特殊改动,只要套件选对,qmake会自动用ARM配置。写个简单按钮程序验证:
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QPushButton btn("Hello Embedded");
btn.resize(200, 100);
btn.show();
return a.exec();
}
这段代码在桌面和嵌入式都能编,区别只在编译出的二进制架构。点“构建”后,可以在项目构建目录下看到file命令识别为ARM可执行文件:
file arm-test # 输出应含: ELF 32-bit LSB executable, ARM
部署方面,QtCreator的“运行”设置里选“在远程设备部署”,指定上一步建好的设备,运行程序时会通过SSH把可执行文件传到板子/tmp并启动。若板子没有屏幕,可以改用Qt的offscreen或linuxfb插件,在运行参数加-platform linuxfb。
四、远程调试与常见问题
调试嵌入式程序要用交叉gdb配合gdbserver。在开发板上运行:
gdbserver :1234 ./arm-test
然后在QtCreator的“调试-开始调试-附加到远程调试服务器”里填板子IP和端口1234,选择器选ARM-Board套件,就能下断点看变量。注意主机gdb必须是arm-linux-gnueabihf-gdb,否则架构不对会报错。
实际配置里常遇到中文乱码、库找不到的问题。乱码多是板子没装中文字体,不是Qt代码问题;库找不到则在板子用ldd查缺失项,把主机对应ARM库拷进sysroot或板子/lib。另外不要忘了给板子qt.conf指定插件路径,否则运行时报“platform plugin not found”。
| 问题现象 | 可能原因 | 解决办法 |
|---|---|---|
| 构建报cannot find -lGL | 主机误用桌面Qt套件 | 项目套件改选ARM-Board |
| 运行报not found | 板子缺动态库 | ldd查缺并复制ARM库 |
| 调试连不上 | gdbserver未启动或端口错 | 板子先起gdbserver再附加 |
只要工具链、Qt库、套件、设备四步都对应好,QtCreator就是非常顺手的嵌入式开发环境。后续还可接入CMake或Qml工程,方法类似,只是Qt版本里换用对应qmake或cmake即可。