我用STM32MP1做了个疫情监控平台2—Qt环境搭建
@
0.系列教程
- 我用STM32MP1做了个疫情监控平台1—交叉编译环境搭建
- 我用STM32MP1做了个疫情监控平台2—Qt环境搭建
- 我用STM32MP1做了个疫情监控平台3—疫情监控平台实现
- 我用STM32MP1做了个疫情监控平台4—功能完善界面重新设计
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安装包的。
官方下载地址:Index of /archive/qt
最好选择Qt 5.8以上,要选择Linux版本的,如qt-opensource-linux-x64-5.11.0.run
,这个安装包是桌面Qt程序开发套件,包括qmake、QtCreator等工具。
实测官方下载速度还是非常快的,如果下载速度慢,可以转到国内的镜像地址:清华大学Qt下载镜像地址,下载速度会很快。
- 安装 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文件,重新导入,编译。
这样编译目录就在工程目录下了:
系列教程
- 我用STM32MP1做了个疫情监控平台1—交叉编译环境搭建
- 我用STM32MP1做了个疫情监控平台2—Qt环境搭建
- 我用STM32MP1做了个疫情监控平台3—疫情监控平台实现
- 我用STM32MP1做了个疫情监控平台4—功能完善界面重新设计
我的公众号:mcu149
我用STM32MP1做了个疫情监控平台2—Qt环境搭建的更多相关文章
- 我用STM32MP1做了个疫情监控平台4—功能完善界面重新设计
目录 前言 界面展示 新增功能 API 接口说明 多个接口数据的获取和解析 FontAwesome字体图标库的使用 代码下载 系列教程 @ 前言 之前我用STM32MP1和Qt实现了疫情监控平台,系列 ...
- 我用STM32MP1做了个疫情监控平台3—疫情监控平台实现
目录 1.前言 2.数据接口的获取 3.Qt界面的实现 4.在开发板上运行Qt程序 5.使用无线模块联网 6.代码下载 @ 1.前言 之前我使用桌面版本Qt实现了肺炎疫情监控平台:基于Qt的新冠肺炎疫 ...
- iMX287A基于嵌入式Qt的新冠肺炎疫情监控平台
目录 1.前言 2.数据接口的获取 3.Qt界面的实现 4.在开发板上运行Qt程序 5.最终效果 6.代码下载 @ 1.前言 之前我使用在桌面版本Qt实现了肺炎疫情监控平台:基于Qt的新冠肺炎疫情数据 ...
- Linux监控平台介绍、zabbix监控介绍、安装zabbix、忘记Admin密码如何做
7月6日任务 19.1 Linux监控平台介绍19.2 zabbix监控介绍19.3/19.4/19.5 安装zabbix19.6 忘记Admin密码如何做 19.1 Linux监控平台介绍 一般大公 ...
- 搭建grafana+telegraf+influxdb服务器性能监控平台
最近在学习性能测试,了解到一套系统资源使用率低的监控环境,也就是grafana+telegraf+influxdb. InfluxDB是一款优秀的时间序列数据库,适合存储设备性能.日志.物联网传感器等 ...
- NLP中的用N-gram语言模型做英语完型填空的环境搭建
本文是对xing_NLP中的用N-gram语言模型做完型填空这样一个NLP项目环境搭建的一个说明,本来想写在README.md中.第一次用github中的wiki,想想尝试一下也不错,然而格式非常的混 ...
- 基于 Serverless +企业微信打造 nCoV 疫情监控小助手
最近的一些疫情信息很让人揪心,为了方便大家掌握疫情信息,在空闲之余做了一个关于 nCoV 的疫情监控小助手.主要的功能是通过企业微信的 WebHook 来推送疫情信息.这里将使用 Serverless ...
- 如何做自己的服务监控?spring boot 2.x服务监控揭秘
Actuator是spring boot项目中非常强大一个功能,有助于对应用程序进行监视和管理,通过 restful api请求来监管.审计.收集应用的运行情况,针对微服务而言它是必不可少的一个环节. ...
- Linux centosVMware Linux监控平台介绍、zabbix监控介绍、安装zabbix、忘记Admin密码如何做
一.Linux监控平台介绍 cacti.nagios.zabbix.smokeping.open-falcon等等 cacti.smokeping偏向于基础监控,成图非常漂亮 cacti.nagios ...
随机推荐
- ArrayList查找和添加元素问题
问题描述: 如上图所示,如果依靠迭代器在List中查找元素并添加元素,会报错:java.util.ConcurrentModificationException原因是在添加元素后,List本身发生了变 ...
- Spring 中的 JDBCTemplate
新建一个java工程 写好spring配置文件,直接上代码 <?xml version="1.0" encoding="UTF-8"?> <b ...
- <SCOI2005>互不侵犯の思路
日常玄学dp #include<cstdio> #include<cstring> #include<iostream> #include<algorithm ...
- Angular2与Angular1的区别
原文地址: http://www.angularjs.cn/A2Ar 整体上来说,Angular2变得更加简洁,最核心的概念只剩下一个,那就是组件Component,其它所有的一切都是围绕着Compo ...
- python字符串复制的几种方法
>>> list1 = [1,2] >>> id(list1) 50081032 >>> list2 = list1.copy() >> ...
- 【U创营学员招募】8节免费云计算课程,让你轻松掌握生产技能
课程不错,免费听课.免费听课.免费听课,强烈推荐-! 公众号对话框回复"课程助手" 即可报名! ---END---
- [人工智能]NumPy基础
理解NumPy 本文主要介绍NumPy的基础知识,NumPy是一个功能强大的Python库,允许更高级的数据操作和数学计算. 什么是NumPy NumPy,来源自两个单词:Numerical和Pyth ...
- 产品需求说明书 PRD模版
XXX产品需求说明书 [版本号:V+数字] 编 制: 日 期: 评 审: 日 期: 批 准: 日 期: 修订记录 版本 修订章节 修订内容 ...
- C++扬帆远航——2
/* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:test.cpp * 作者:常轩 * 完成日期:2016年3月6 ...
- C++走向远洋——67(项目二、洗牌)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...