嵌入式linux 编译qt5(以v851s为例)

本文参考Blev大神的博客:Yuzuki Lizard V851S开发板 --移植 QT5.12.9教程(群友Blev提供) - Allwinner / 柚木PI-V851S - 嵌入式开发问答社区 (100ask.net)

一. 环境准备 

1.下载qt5源码:Open Source Development | Open Source License | Qt 或者从v851s sdk 中获取

路径:tina-v853-docker/platform/thirdparty/gui/qt/qt-5.12.9.tar.xz

2. 编译环境:vmware虚拟机安装的ubuntu22.10

3. 交叉编译工具:v851s sdk 中的toolchain

路径:tina-v853-docker/prebuilt/rootfsbuilt/arm/toolchain-sunxi-musl-gcc-830

4. ubuntu下需要安装的依赖库:

apt-get install repo git gcc-arm-linux-gnueabihf u-boot-tools device-tree-compiler mtools \
parted libudev-dev libusb-1.0-0-dev python-linaro-image-tools linaro-image-tools libssl-dev \
autotools-dev libsigsegv2 m4 libdrm-dev curl sed make binutils build-essential gcc g++ bash \
patch gzip bzip2 perl tar cpio python unzip rsync file bc wget libncurses5 libglib2.0-dev \
openssh-client lib32stdc++6 gcc-aarch64-linux-gnu libncurses5-dev lzop libssl1.0.0 libssl-dev \
libglade2-dev cvs mercurial subversion asciidoc w3m dblatex graphviz python-matplotlib \
libc6:i386 texinfo liblz4-tool genext2fs expect autoconf intltool libqt4-dev libgtk2.0-dev

二. 解压qt5源码进行编译

1. 在 ubuntu 的 home/xxx/ 下创建一个qt5 的文件,解压qt5 源码

tar -xvf qt-xxx.tar.xz

2. 将交叉编译工具放到 ubuntu 的home/xxx/  ,采用绝对路径的方式调用交叉编译工具

3. 在qt5 源码根目录下创建 build.sh 写入编译规则 ,并且给权限

touch build.sh
chmod 777 build.sh

在 build.sh 中写入编译规则:

#!/bin/sh
PWD=`pwd`mkdir arm-qt./configure \-prefix $PWD/arm-qt \-release \-opensource \-shared \-xplatform linux-arm-gnueabi-g++ \-optimized-qmake \-pch \-qt-sqlite \-qt-libjpeg \-qt-libpng \-qt-zlib \-no-opengl \-skip qt3d \-skip qtcanvas3d \-skip qtpurchasing \-skip qtlocation \-skip qttools \-no-sse2 \-no-openssl \-no-cups \-no-glib \-no-dbus \-no-xcb \-no-iconv \-no-separate-debug-info \-no-fontconfig \-recheck-all \-make examplesmake -j16 make install

4. 配置交叉编译工具路径,qt5源码根目录下打开文件qmake.conf:

gedit qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf

#
# qmake configuration for building with arm-linux-gnueabi-g++
#MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublibinclude(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)#一定要是你 toolchain 的绝对路径,不要写错
#CROSS_COMPILE=arm-openwrt-linux
#CROSS_COMPILE=/home/navy/v851s/Yuzukilizard/toolchain/toolchain-sunxi-musl-gcc-830/toolchain/bin/arm-openwrt-linux
CROSS_COMPILE=/home/navy/v851s/Yuzukilizard/toolchain/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi# modifications to g++.conf
QMAKE_CC                = $${CROSS_COMPILE}-gcc
QMAKE_CXX               = $${CROSS_COMPILE}-g++
QMAKE_LINK              = $${CROSS_COMPILE}-g++
QMAKE_LINK_SHLIB        = $${CROSS_COMPILE}-g++# modifications to linux.conf
QMAKE_AR                = $${CROSS_COMPILE}-ar cqs
QMAKE_OBJCOPY           = $${CROSS_COMPILE}-objcopy
QMAKE_NM                = $${CROSS_COMPILE}-nm -P
QMAKE_STRIP             = $${CROSS_COMPILE}-strip
load(qt_config)

5. 编译并安装产生库文件

  在qt5 源码根目录下执行:

./build.sh

  执行:

make install

  将会在qt5 根目录arm-qt 文件中产生所有的qt5 的库文件,将其下载到嵌入式开发版中即可。

三. 编写qtDemo 进行测试

1. 在 ubuntu home/xxx/ 中创建qtDemo 文件夹,并且创建两个文件helloworld.cpp 和 helloworld.pro 

mkdir qtDemo
touch helloworld.cpp
touch helloworld.pro

在 helloworld.cpp 中写入:

#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QSlider>
#include <QHBoxLayout>int main(int argc, char **argv)
{QApplication app(argc, argv);QWidget *window  = new QWidget;window->setWindowTitle("I am a slider");QLabel *label = new QLabel;  // QLabel控件,用于显示数字QSlider *slider = new QSlider(Qt::Horizontal);  // 滑动条slider->setRange(0, 100);QObject::connect(slider, SIGNAL(valueChanged(int)), label, SLOT(setNum(int)));slider->setValue(50);QHBoxLayout *layout = new QHBoxLayout; //level layout->addWidget(label);layout->addWidget(slider);window->setLayout(layout);window->resize(400, 240);window->show();return app.exec();
}

在 helloworld.pro 中写入:

######################################################################
# Automatically generated by qmake (3.1) Fri Jan 12 17:28:28 2024
######################################################################TEMPLATE = app
TARGET = helloworld
INCLUDEPATH += .# The following define makes your compiler warn you if you use any
# feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0# Input
SOURCES += helloworld.cppgreaterThan(QT_MAJOR_VERSION, 4): QT += widgets

2. 通过编译出来的qt5 对demo 进行测试:

在qt源码目录下执行:

arm-qt/bin/qmake -project
arm-qt/bin/qmake
arm-qt/bin/qmake helloworld.cpp

将产生的二进制文件helloworld 下载到嵌入式开发板,给权限,执行./helloworld 即可。

chmod 777 helloworld
./helloworld

 ******* 如果提示库文件出错,请将xxx5.12.9.so 库文件名均改成xxx5.so

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/618022.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XXL-JOB相关问题及答案(2024)

1、XXL-JOB是什么&#xff1f;它的作用是什么&#xff1f; XXL-JOB是一个分布式任务调度平台&#xff0c;用于实现任务的定时调度、任务执行和任务监控。它具有可视化的任务管理界面&#xff0c;支持多种任务调度方式&#xff0c;并提供任务执行结果的监控和告警功能。XXL-JO…

okhttpclient.setsslsocketfactory 报错解决

以前一直都用HttpUrlConnection这个类来做通信和进行文件下载&#xff0c;apk更新升级等。 后续因为更新apk的时候包体积较大&#xff0c;网络不好的时候&#xff0c;用HttpUrlConnection偶尔会下载失败&#xff0c;于是下载更新apk就改为了okhtt3这个库&#xff0c;其他业务请…

【Maven】001-Maven 概述

【Maven】001-Maven 概述 文章目录 【Maven】001-Maven 概述一、Maven 概述1、为什么学习 MavenMaven 作为依赖管理工具Maven 作为构建工具其它 2、Maven 介绍3、Maven 软件工作模型图 一、Maven 概述 1、为什么学习 Maven Maven 作为依赖管理工具 依赖管理&#xff1a; Mave…

IDEA集成Gitee(码云)

文章目录 创建新仓库&#xff0c;存放项目拉取Gitee上的项目 1、安装插件 Idea默认不带码云插件&#xff0c;我们第一步要安装Gitee插件。 如图所示&#xff0c;在Idea插件商店搜索Gitee&#xff0c;然后点击右侧的Install按钮。 2、Settings>Version Conttol>Gitee 这里…

第二十一章 javascript数据代理(数据劫持)

文章目录 一、数据劫持对象的访问器属性 二、Object.defineProperty()三、Proxy()四、补充1. Object类新增方法2. Array类新增方法 一、数据劫持 数据劫持&#xff1a;能够拦截到数据被使用或被修改的时机&#xff0c;在这个时机除了可以获取数据的值或对数据的值进行修改之外…

数据分析基础

数据运营的概念及意义 数据分析的三个维度 数据总览的作用及提升方法 数据总览的作用及提升方法 数据总览的作用及提升方法小结 影响作品数据的关键因素 影响作品数据的关键因素小结 用户数据的意义与作用 用户数据分析的方法与操作 用户数据分析的方法与操作小结 数据运营小结…

Java并发 - 原子类

CAS 原子操作 CAS&#xff08;Compare and Swap&#xff09;是一种并发算法&#xff0c;通常用于实现多线程环境下的同步操作&#xff0c;特别是在并发编程中实现无锁算法。CAS操作涉及三个参数&#xff1a;内存位置&#xff08;V&#xff09;、期望值&#xff08;A&#xff0…

数据仓库 Apache Hive

一、数据分析 1、数据仓库 数据仓库&#xff08;英语&#xff1a;Data Warehouse&#xff0c;简称数仓、DW&#xff09;&#xff0c;是一个用于存储、分析、报告的数据系统。 数据仓库的目的是构建面向分析的集成化数据环境&#xff0c;分析结果为企业提供决策支持&#xff08…

Unity 编辑器篇|(四)编辑器拓展GUI类 (全面总结 | 建议收藏)

目录 1. 前言2. 参数2.1 静态变量2.2 静态函数2.3 委托 3. 功能3.1 按钮&#xff1a;Button、RepeatButton3.2 文本&#xff1a;Label 、TextField 、TextArea 、PasswordField3.3 滑动条&#xff1a;HorizontalScrollbar 、VerticalScrollbar3.4 滑条&#xff1a;VerticalSlid…

Java基础(抽象类)

文章目录 一、抽象类特性代码示例 二、抽象类注意事项三、抽象类和接口的比较 刚刚学了Python的多态和抽象类&#xff0c;就想着跟Java的比对一下。 一、抽象类特性 抽象类不能被实例化&#xff1a;抽象类只能用作其他类的基类&#xff0c;不能直接创建实例。子类必须实现所有…

表单生成器基于(form-create-designer+ant design vue)

效果展示 1.源码地址&#xff1a; 前端&#xff1a;https://gitee.com/houshixin/form-design-ui 后端&#xff1a;https://gitee.com/houshixin/form-design-web 2.单独使用前端的时候就把请前后台的接口注释就可以 3.都启动的话&#xff1a; 1&#xff09;.先导入数据库 2.表…

3. Mybatis 中SQL 执行原理

2. Mybatis 中SQL 执行原理 这里有两种方式&#xff0c;一种为常用的 Spring 依赖注入 Mapper 的方式。另一种为直接使用 SqlSessionTemplate 执行 Sql 的方式。 Spring 依赖注入 Mapper 的方式 Mapper 接口注入 SpringIOC 容器 Spring 容器在扫描 BeanDefinition 阶段会扫…

C++代码重用:继承与组合的比较

目录 一、简介 继承 组合 二、继承 三、组合 四、案例说明 4.1一个电子商务系统 4.1.1继承方式 在上述代码中&#xff0c;Order类继承自User类。通过继承&#xff0c;Order类获得了User类的成员函数和成员变量&#xff0c;并且可以添加自己的特性。我们重写了displayI…

C# 关于当ObservableCollection增删查改元素时,触发事件用例

ObservableCollection 类提供了一种实时监测集合变化的机制&#xff0c;可以通过订阅 CollectionChanged 事件来响应集合的添加、移除和重置等变化。 using System; using System.Collections.ObjectModel; using System.Collections.Specialized;class Program {static void …

【java八股文】之Redis基础篇

1、Redis有哪几种基本的数据类型 字符串类型&#xff1a;用于存储文章的访问量Hash&#xff1a;用来存储key-value的数据结构&#xff0c;当单个元素比较小和元素数量比较少的时候 &#xff0c;底层是用ziplist存储。通常可以用来存储一些对象之类的List: 底层采用的quicklist …

2024儿童台灯哪个品牌更护眼推荐?五款知名品牌台灯推荐

只要有了娃&#xff0c;家长的吃穿用度可能不会特别讲究&#xff0c;但总想给孩子好的东西&#xff0c;尤其是关系到他们身心健康的&#xff0c;可以说是一掷千金。特别是眼睛视力方面&#xff0c;特别担心会遗传给孩子&#xff0c;自从他上幼儿园&#xff0c;我就一直在物色一…

WPF 获取父容器控件的宽度

在WPF中&#xff0c;如果你想要获取一个控件的父容器&#xff08;Parent&#xff09;的宽度&#xff0c;你可以通过以下方式访问&#xff1a; double parentWidth this.Parent.ActualWidth;这里的 this 指的是当前控件实例。.Parent 属性返回直接父容器&#xff0c;.ActualWi…

WSL不同版本的Ubuntu更换清华镜像,加速Ubuntu软件下载速度

文章目录 不同版本的Ubuntu使用清华镜像&#xff0c;加速Ubuntu软件下载速度1. 备份源软件配置文件2. 复制镜像源3. 修改软件源配置文件4. 更新软件包列表&#xff0c;升级软件包等内容5. 从仓库中下载其它软件可能存在的问题 不同版本的Ubuntu使用清华镜像&#xff0c;加速Ubu…

鸿蒙Harmony--LocalStorage--页面级UI状态存储详解

走的太急疼的是脚&#xff0c;逼的太紧累的是心&#xff0c;很多时候&#xff0c;慢一点也没关系&#xff0c;多给自己一些耐心和等待&#xff0c;保持热爱&#xff0c;当下即是未来&#xff0c;生活自有安排! 目录 一&#xff0c;定义 二&#xff0c;LocalStorageProp定义 三…

【面试宝典】如何对MySQL进行优化?

一、数据库设计 所有字段都设置默认值。尽可能使用较小的整数类型。尽可能定义字段为NOT NULL,除非该字段需要NULL。尽可能使用固定大小的记录格式,如CHAR,除非变长字段用VARCHAR。二、数据库使用 尽量使用长连接。使用 EXPLAIN 查看复杂SQL执行方式,进行优化。使用 LIMIT …