使用Qt进行嵌入式开发的原因
在Windows下进行软件开发和Linux下进行开发的一大区别在于,Winodws下通常不需要使用者写Makefile,一般通过集成的开发环境开发。而在Linux中,很多开发环境要求我们自己去手写Makefile,对新手来说不太友好。因此新手可以通过Qt的QMake实现自动编写Makefile。为开发带来一定的便利。而且通过Qt可以方便的进行嵌入式程序的远程调试。
硬件平台
本文使用的方式在Zynq7000系列芯片和Zynq Ultrascales+系列芯片上进行过验证
需提前具备的开发环境
- 嵌入式设备,嵌入式设备文件系统中需要安装ssh服务和tftp服务
- qt源代码(5.14.2)
- qt creator x86版本(博主使用的是5.14.2版本)
- 交叉编译工具链
- 开发电脑安装openssh-server,openssh-passwd,gdb-multiarch(这款工具支持和多种架构的嵌入式设备调试,灰常好用)
安装流程
安装qt creator
双击qt安装程序,安装qt creator,此过程比较简单。选择一个不带中文路径的安装路径,勾选下图勾选的几个选项即可。安装成功后,打开qtcreator。新建一个程序测试是否安装成功。
注意:qt的工作路径不能包含中文字符,否则会编译失败!
编译qt源码
进行此步操作的目的主要是得到一个嵌入式开发版的qmake。
需要注意的是Qt源代码有一些奇奇怪怪的bug,通过交叉编译工具链aarch64-linux-gnu编译qmake,qt4.9,qt5.3,qt5.9.7均报了一些奇怪的错误。最后qt5.14.2一次性编译通过。建议若想使用其他版本qt尽量选择高版本,bug较少。
在编译qt前要先确保已经把交叉工具链加入到环境变量中。可通过控制台输入aarch64-linux-gnu-gcc -v查询
- tar -vxf *** 解压qt源码程序
- cd *** 切换到安装目录
- 创建一个configure脚本
#!/bin/sh
./configure -prefix /home/xuxu/arm/sdk5.14 \
-opensource \
-release \
-no-pch \
-confirm-license \
-xplatform linux-aarch64-gnu-g++ \
-qt-zlib \
-no-iconv \
-no-gif \
-qt-libjpeg \
-no-opengl \
-skip qtdeclarative \
-skip qtquickcontrols \
-skip qtquickcontrols2 \
-no-cups \
-no-glib \
-no-dbus \
-no-rpath \
-no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 \
-no-avx \
-no-openssl \
-nomake tools \
-no-libpng \
-nomake examples
-prefix代表的是指定生成文件的路径,-platform中指定交叉编译链linux-aarch64-gun-g++。注意linux-aarch64-gun-g++并不是直接代表交叉编译链,配置此项后qt会在qtbase/mkspecs下寻找linux-aarch64-gun-g++目录,并读取其中的qmake.conf配置信息。这里使用默认的就可以,不需要修改。
其余配置项,可通过./configure –help或百度查询,无特殊需求不建议修改。
4. 配置结束后会生成一个Makefile,控制台输入make -j*。编译较慢,建议使用多核。
5. 控制台输入make install。一切执行正常则会在指定目录下生成我们需要的文件。
配置qt creator
- 运行qt creator。选择 工具->选项进入设置界面,选择设备
2. 选择添加->Linux设备->设备Ip(本文采用使用密码的方式连接设备)
3. 添加完成后,选择Test测试。若设备检测成功代表设备检测正常。注意测试rsync服务是否正常,若设备安装了rsync服务,则可通过使用rsync服务进行远程调试,否则使用另一种使用Openssh服务的方法
4. 选择设置界面中的Kits->Debuggers。新建一个调试器,选择调试器路径。我这里使用的是gdb-multiarch,好处是可以连接多版本的gdbserver,比较方便。也可以使用make出来的gdb,生成gdb方法不再这里介绍。点击apply。
5. 选择编译器,添加一个C语言和C++的编译器。路径选择交叉工具链下的gcc和g++即可。点击Apply
6. 选择Qt Vertions添加一个Qt vertion,选择刚刚编译qt生成的qmake。(黄色感叹号是版本不匹配问题,不影响使用)
7. 点击构建套件,添加一个构建套件,选择上文添加的设备、编译器、调试器、qt vertion,如下图。
8. 拷贝gdbserver至设备
可以使用交叉工具链里的gdbserver,将其移动到设备/usr/bin下即可
运行测试
有rsync工具的调试过程
此时可以连接板子,确保连接成功后,即可开始调试。
另外,需要指定调试运行路径。在pro中加入指令。
target.path = /mnt
INSTALLS += target
无rsync工具调试过程
1. 点击项目,点击需要配置的构建套件,点击run。删除通过SFTP上传。
- 在添加Deploy步骤中添加CustumProcessStep
ssh
-p %{Device:SshPort} %{Device:UserName}@%{Device:HostAddress} 'mkdir -p %{CurrentRun:Executable:Path}'
scp
-P %{Device:SshPort} %{CurrentRun:Executable:FileName} %{Device:UserName}@%{Device:HostAddress}:%{CurrentRun:Executable:FilePath}
- 最后运行结果
改定,可以开心的开发,调试,打断点了!!!
最后
嵌入式开发还可以采用另一种通过VsCode进行远程调试的方法。此方法不在此文描述~