| | |

我用stm32mp1做了个疫情监控平台2—qt环境搭建 -凯发app

文章来源:米尔科技 发布日期:2020.5.25 浏览次数:401 次

1.嵌入式qt简介

qt 是一个跨平台的应用程序开发框架。使用qt开发的应用程序,只需要编写一套代码,然后把这套代码放在不同平台的qt环境去编译,就会生成可以运行在对应平台的应用程序。例如,我在windows写了一个串口助手,这套代码不用修改,放在linux环境下的qt开发环境,重新编译,就可以生成可以在linux环境下运行的串口助手,当然,qt支持的环境有很多。不同平台下的移植,只需要修改很小一部分或者不用修改就可以直接运行。

嵌入式qt,即qte,属于qt embedded linux 分支平台。qt/e 所面对的硬件平台较多,当开发人员需要在某硬件平台上移植 qt/e 时,需要下载qt 源代码,利用交叉编译器编译出 qt 库。接着需要将 qt 库复制两份,一份放置在开发主机上,供编译使用;一份放在目标板上,供运行时动态加载使用。

2.查看开发板qt库的版本

要想在开发板上运行qt程序,首先板子的系统要支持qt图形库,而且要确定这个的库的版本。那么怎么看开发板是否支持qt呢?可以使用find搜索命令,搜索本地所有qt相关的文件:

#进入到根目录
cd /
#搜索qt相关的文件
find -name "*qt*"
#或者
find -name "*qt*" 

如果搜索结果有很多so类型的文件,说明这个开发板上的系统是支持qt的,而且后面的数字就是当前qt库的版本号。

可以看出,现在的系统是支持qt的,库的版本是5.11.2。

3.主机搭建qt环境

3.1 安装桌面版本qt开发套件

安装桌面版本的 qt 开发套件,用户可以先在 pc 主机上进行 qt 应用程序的开发和调试,待应用程序完成之后,再使用嵌入式qt套件构建一下,就可以生成可以在开发板上运行的目标程序。由于开发板上的qt库版本是5.11版本的,建议桌面qt版本尽量也是5.11版本的,如果不一致影响也不大。如果你的电脑上已经安装了qt 5 linux版本,这一节可以跳过。由于我的电脑之前已经安装了5.8版本的,所以不再重新安装。

  • 下载 qt

qt 安装包从qt 5版本开始提供linux版本的独立安装包,而不需要自己编译。在之前的qt 4版本,是没有linux安装包的。

官方下载地址:

最好选择qt 5.8以上,要选择linux版本的,如qt-opensource-linux-x64-5.11.0.run,这个安装包是桌面qt程序开发套件,包括qmake、qtcreator等工具。

实测官方下载速度还是非常快的,如果下载速度慢,可以转到国内的镜像地址:,下载速度会很快。

  • 安装 qt

下载完成之后,直接双击安装就可以了,如果不能安装尝试添加可执行权限,或者以sudo权限执行:

#添加可执行权限
sudo chmod  x ./qt-opensource-linux-x64-5.11.0.run
#安装
sudo ./qt-opensource-linux-x64-5.11.0.run
#安装路径可根据需要选择
#其他选择默认安装配置就行了 

安装完成之后:

其中maintenancetool是qt的安装管理程序,运行这个文件可卸载qt。

  • 启动 qt

安装完成之后,可以在ubuntu搜索qt关键字,点击qt creator启动qt环境。

你也可以进入到/qt5.8.0/tools/qtcreator/bin文件夹去启动qt,如果启动失败,添加sudo 权限试试。

3.2 添加嵌入式qt构建套件

搭建一个最基本的qt环境,需要两个东西:qmake和编译器。在安装桌面版本 qt 时,已经默认添加了桌面环境的qt构建套件:

  • 桌面版本qmake:qt5.8.0/5.8/gcc_64/bin/qmake
  • 桌面版本编译器:ubuntu 自带的gcc

为了编译可以在开发板上运行的qt程序,我们还需要配置一个开发嵌入式qt程序的构建套件:

#嵌入式qmake路径
/opt/st/stm32mp1/2.6-snapshot/sysroots/x86_64-openstlinux_eglfs_sdk-linux/usr/bin/qmake
#交叉编译器路径:
/opt/st/stm32mp1/2.6-snapshot/sysroots/x86_64-openstlinux_eglfs_sdk-linux/usr/bin/arm-openstlinux_eglfs-linux-gnueabi/arm-openstlinux_eglfs-linux-gnueabi-gcc 

可以看到嵌入式qt的版本是5.11.2。知道了qmake和交叉编译器的路径,下面我们在桌面版本qt中添加一个开发套件,用于构建嵌入式qt程序。

  • 添加交叉编译器

打开qtcreator之后,点击菜单栏的工具->选项->构建和运行->编译器,添加交叉编译器:

#添加gcc交叉编译器
名称:ya157c_gcc
路径:/opt/st/stm32mp1/2.6-snapshot/sysroots/x86_64-openstlinux_eglfs_sdk-linux/usr/bin/arm-openstlinux_eglfs-linux-gnueabi/arm-openstlinux_eglfs-linux-gnueabi-gcc
#添加g  交叉编译器
名称:ya157c_g  
路径:/opt/st/stm32mp1/2.6-snapshot/sysroots/x86_64-openstlinux_eglfs_sdk-linux/usr/bin/arm-openstlinux_eglfs-linux-gnueabi/arm-openstlinux_eglfs-linux-gnueabi-g  
#添加gdb调试器
名称:ya157c_gdb
路径:/opt/st/stm32mp1/2.6-snapshot/sysroots/x86_64-openstlinux_eglfs_sdk-linux/usr/bin/arm-openstlinux_eglfs-linux-gnueabi/arm-openstlinux_eglfs-linux-gnueabi-gdb 
  • 添加嵌入式版本qmake
#嵌入式qt版本的qmake路径
路径:/opt/st/stm32mp1/2.6-snapshot/sysroots/x86_64-openstlinux_eglfs_sdk-linux/usr/bin/qmake 
  • 添加设备

这一步可省略。

#添加一个通用linux设备
设备类型:通用linux
设备名称:ya157c
主机名称:192.168.1.136
用户名:root
密码:root 
  • 添加嵌入式qt开发套件

以上都是为了添加开发套件而服务的,开发套件需要指定qmake和编译器等。新建一个构建套件

名称:ya157c
设备类型:通用linux设备
设备:选择之前添加的ya157c
sysroot:/opt/st/stm32mp1/2.6-snapshot/sysroots/cortexa7t2hf-neon-vfpv4-openstlinux_eglfs-linux-gnueabi
c编译器:选择之前添加的ya157c_gcc
c  编译器:选择之前添加的ya157c_g  
调试器:选择之前添加的ya157c_gdb
qt版本:选择之前添加的qt 5.11.2
qt mkspec:linux-oe-g   

点击apply之后,如果构建套件前面有红色或黄色的感叹号,说明构建套件没有设置成功,需要检查配置选项。下面,我们来完成第一个qt应用程序——hello world。

4.第一个qt程序——hello world

嵌入式qt应用程序的开发,可以完全按照桌面程序的开发流程:新建工程、设计界面和功能、编译运行。最后使用嵌入式开发套件构建一下,就生成了可以在嵌入式平台运行的qt应用程序。

我们来设计一个简单的界面,程序只显示一个标签,标签的内容是“hello world”。在pc上运行正确之后,然后使用ya157c开发套件交叉编译,再把可执行文件传输到开发板上运行,整个过程不需要写一行代码。

桌面效果:

开发板效果

4.1 新建一个工程

  • 新建一个应用程序工程
  • 输入工程名称和保存路径
  • 选择构建套件

就是这个程序在哪些平台上运行,我们选择桌面(desktop qt 5.8)和开发板(ya157c)这两个套件,如果只选择了一个,在开发过程中也可以再添加其他的构建套件。

  • 工程创建
  • 界面设计

拖入一个label,内容是”hello world”,并调整一下字体和布局。

这样就创建完成了一个最简单的hello world应用程序。

4.2 pc运行qt程序

点击左下绿色三角符号,构建并运行,实际效果:

4.3 开发板运行qt程序

桌面版本运行正常之后,点击左下角电脑标志,切换为ya157c构建套件,再点击底部锤子按钮,交叉编译这个工程。

注意,由于这是交叉编译,所以编译出来的程序不能在本地 pc 机上运行或调试。因此不能点击运行按钮运行程序,也不能点击调试按钮调试程序。

如果构建成功,编译输出的文件默认在当前工程目录的上一级。

可以看到,成功输出了arm平台下运行的可执行文件。通过scp或其他方式把文件传输到开发板:

#scp传输可执行文件到开发板
scp hello_world root@192.168.1.136:/home/root 

连接hdmi显示器或rgb显示屏,我使用的是7寸ips屏,1024*600分辨率。

开发板运行效果:

5.一些问题

  • 交叉编译时报错

桌面qt套件编译时,正常。但是使用交叉编译套件编译会提示错误:

可以通过执行以下命令,复制相应的库文件:

#切换到库所在的文件夹
cd /opt/st/stm32mp1/2.6-snapshot/sysroots/cortexa7t2hf-neon-vfpv4-openstlinux_eglfs-linux-gnueabi/vendor/lib/
#复制库文件
cp -d * ../../lib/ 

复制完成之后,再编译就不会报错了。

  • 液晶屏不能显示程序界面

如果在运行qt程序时,出现如下提示:

qstandardpaths: xdg_runtime_dir not set, defaulting to '/tmp/runtime-root'
qt.qpa.input: x-less xkbcommon not available, not performing key mapping
could not queue drm page flip on screen hdmi1 (device or resource busy) 

或者可以运行,但字体太小了。可以尝试在运行程序之前,先执行以下命令,再运行qt程序

psplash-drm-quit
export qt_qpa_eglfs_always_set_mode="1"
export qt_qpa_eglfs_physical_width=150
export qt_qpa_eglfs_physical_height=90 

其中,150和90是显示屏的物理尺寸,长150mm,宽90mm。

  • 编译输出到当前工程文件夹下

qt工程编译输出的debug/release目录是在当前工程目录的上一级:

../build-%{currentproject:name}-%{currentkit:filesystemname}-%{currentbuild:name} 

可以改为和工程文件同一目录下:

./build-%{currentproject:name}-%{currentkit:filesystemname}-%{currentbuild:name} 

去掉一个.就好了。

然后关闭工程,删除工程目录下的.user文件,重新导入,编译。

这样编译目录就在工程目录下了:


本文来自凯发app-凯发k8官网科技,原文地址: http://www.myir-tech.com/resource/539.asp,转载请注明出处。

比较和选型

手册教程

应用笔记

好书推荐

凯发k8官网的技术支持服务指南

常见问题解答

网站地图