LPA3399Pro搭建Qt开发环境

将以前的开发文档在此做一个记录。

一、介绍

Qt是一个跨平台的应用程序开发框架,支持多种操作系统和硬件架构,包括ARM架构的Linux。

RK3399Pro是一款基于ARM架构的处理器,用于嵌入式系统。可以在RK3399上搭建Qt开发环境,进行项目开发。

在ARM架构的Linux系统上安装Qt开发环境,大致需要以下几步:安装交叉编译工具链、下载Qt源代码、编译安装Qt源码。

二、搭建步骤

假定工控机内已安装完成Ubuntu20.04。

1、安装交叉编译工具链

可以从Ubuntu软件源中安装,也可以从第三方资源库或官方网站下载。以下是在Ubuntu软件源中安装交叉编译工具链的命令:

sudo apt-get update

sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

sudo apt install cmake

通过如下命令验证是否安装成功:

aarch64-linux-gnu-gcc -v

aarch64-linux-gnu-g++ -v

若出现类似下图所示情况,则证明安装成功了。

说明:

gcc-aarch64-linux-gnu和g++-aarch64-linux-gnu是交叉编译工具链中的两个工具,用于在x86或者其他架构的系统上编译ARM架构的代码。gcc-aarch64-linux-gnu是GCC编译器的一个ARM64交叉编译版本,可以将C代码编译成ARM64平台上的可执行文件。而g++-aarch64-linux-gnu则是G++编译器的ARM64交叉编译版本,用于编译C++代码。

在RK3399 ARM架构的系统中搭建QT开发环境时,需要使用这两个工具来编译QT应用程序,因为QT开发工具包是在x86架构的系统上编译的,无法直接在ARM架构的系统上运行。因此需要使用交叉编译工具链将QT应用程序编译成可以在ARM架构的系统上运行的可执行文件。

安装xcb

       在如下连接Index of /dist中下载libxcb-1.9.tar.gzxcb-proto-1.9.tar.gz

将两个压缩包分别解压到工控机中,并进入各自目录中,进行如下操作来安装xcb库:

cdxcb-proto-1.9源代码目录中

./configure

make

make install

然后cdlibxcb-1.9源代码目录中

./configure

make

make install

 

至此,libxcb库已经安装到系统中,安装目录为/usr/lib/aarch64-linux-gnu

注:xcb库是图形界面所用的库,对于只开发命令行程序的工控机,无需安装  

2、下载Qt源代码并解压

1)下载源码:

可以在官网Index of /official_releases/qt/6.5/6.5.0/single下载qt-everywhere-src-6.5.0.tar.xz。

也可以在此链接Index of /official_releases/qt/6.5/6.5.0/submodules只下载自己项目需要的子部件,需要下载.tar.xz格式的压缩包。

可以在Windows下下载完成后拷贝到Ubuntu中,也可直接在Ubuntu中的浏览器下载。

2)解压源码

将下载的qt-everywhere-src-6.5.0.tar.xz压缩包复制到/opt目录下:

cp qt-everywhere-src-6.5.0.tar.xz /opt

完成后在/opt目录下输入命令:

tar -xvf qt-everywhere-src-6.5.0.tar.xz

解压完成后进入获得的文件夹下:

cd /opt/qt-everywhere-src-6.5.0

ls一下:

ls

可以看到很多文件,类似下面这张图。

3、编译Qt源码并安装

接着上一步输入命令

sudo gedit /opt/ qt-everywhere-src-6.5.0/qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf

在其中添加如下内容并保存:

QT_QPA_DEFAULT_PLATFORM = linuxfb

QMAKE_CFLAGS_RELEASE += -O2 -march=armv8-a -lts

QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv8-a -lts

类似下图所示:

说明:

没有gedit命令的话,可以先通过apt安装,或者直接用vim进行编辑。

·QT_QPA_DEFAULT_PLATFORM = linuxfb:设置QT的平台插件为linuxfb,表示使用Linux Framebuffer作为GUI显示的方式。Linux Framebuffer是Linux内核提供的一种硬件无关的图形显示抽象层,可以让用户空间程序通过读写Linux Framebuffer设备节点来实现图形显示功能。

·QMAKE_CFLAGS_RELEASE += -O2 -march=armv8-a -lts:编译选项,表示编译Release版本的代码时启用-O2优化级别和ARMv8-A架构的指令集。-O2优化级别表示启用一些优化选项来提高代码执行效率,ARMv8-A指令集是ARM架构的64位指令集。-lts表示链接名为ts的库文件,该库文件用于支持触摸屏输入。

·QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv8-a -lts:类似于QMAKE_CFLAGS_RELEASE,但是是用于编译C++代码的选项。

这些选项和环境变量可以帮助QT应用程序在ARM架构的系统上编译和运行。通过使用linuxfb平台插件,可以让QT应用程序使用Linux Framebuffer作为图形界面显示方式,而编译选项中的优化选项可以提高代码执行效率,使得应用程序的运行更加流畅。

保存后接着输入命令:

sudo gedit auto.sh

新建的auto.sh为交叉编译自动配置脚本,在其中添加以下内容并保存:

#!/bin/sh

./configure \-prefix /opt/qt6.4.3-arm \

-confirm-license \

-opensource \

-release \

-make libs \

-xplatform linux-aarch64-gnu-g++ \

-pch \

-qt-libjpeg \

-qt-libpng \

-qt-zlib \

-no-opengl \

-no-sse2 \

-no-openssl \

-no-cups \

-no-glib \

-no-xcb \

-no-dbus \

-no-separate-debug-info \

其中/opt/qt6.4.3-arm 为编译后的安装目录,-xplatform linux-aarch64-gnu-g++为交叉编译相关选择,还记得之前我们修改过/opt/qtbase-everywhere-opensource-src-6.4.3/mkspecs/linux-aarch64-gnu-g++文件夹下的qmake.conf文件吧,前后是有对应的。

说明:

·-prefix /opt/qt6.4.3-arm:指定QT编译后的安装目录为/opt/qt6.4.3-arm。

·-confirm-license:确认QT的使用许可证。

·-opensource:使用开源版本的QT。

·-release:编译QT的Release版本。

·-make libs:只编译QT库文件。

·-xplatform linux-aarch64-gnu-g++:指定QT的交叉编译平台为aarch64架构的Linux系统,使用的编译器为GNU C++。

·-pch:启用预编译头文件。

·-qt-libjpeg、-qt-libpng、-qt-zlib:指定QT需要使用的图像文件解码库(libjpeg、libpng、zlib)。

·-no-opengl:不使用OpenGL。

·-no-sse2:不使用SSE2指令集,这是为了兼容一些老的ARM处理器,这些处理器不支持SSE2指令集。

·-no-openssl:不使用OpenSSL库。

·-no-cups:不使用CUPS打印系统。

·-no-glib:不使用GLib库。

·-no-xcb:不使用XCB库。

·-no-dbus:不使用DBus。

·-no-separate-debug-info:不生成独立的调试信息。

这些参数的设置可以根据具体情况进行调整,以适应特定的应用场景和目标平台。这些参数和选项的使用可以帮助用户在ARM架构的Linux系统上编译出符合要求的QT库文件,以便开发和运行QT应用程序。

接着修改该文件权限并执行:

sudo chmod u+x auto.sh

sudo ./auto.sh

注:如果提示找不到cmake命令或者对应版本不对,可以在auto.sh脚本的第二行加上:export PATH=/path/to/cmake/bin:$PATH  来指定cmake命令

首次时间会比较长。结束后会显示类似下图的结果,并生成Makefile文件。

接着输入:

sudo make

进行编译,大概需要一个小时,编译完成后输入命令:

sudo make install

大约一分钟后,可以看见/opt目录下出现了指定的安装目录/opt/qt6.4.3-arm,表示安装成功。

4、设置环境变量

此时系统可能找不到我们需要的qmake,需要手动配置环境变量。

打开/etc/profile:

sudo gedit /etc/profile

在末尾增加以下代码

export QTDIR=/opt/qt6.4.3-arm             //跟自己的Qt安装路径对应 

export PATH=$QTDIR/bin:$PATH

export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

保存退出后,使用如下命令使其生效:

source /etc/profile

然后重启系统。可以使用如下命令检查是否配置成功:

qmake -v

如果有对应的qt版本信息输出,则说明Qt已经安装成功。

对于不同项目,比如使用了opencv、ffmpag、seetaface等,需要将对应的库路径配置好,或将库文件放到/opt/qt6.5-arm/lib中。

5、编译子模块注意事项

如果一次编译整个Qt源码,则用上边的方法可行。

如果只编译几个Qt子模块,需要更改一些操作:

1) 按照上边的完整步骤编译qtbase子模块。

2) 编译成功后更改环境变量,将下列语句加入进去:

export QT6_DIT=/opt/qt6.4.3-arm/lib/cmake/Qt6

export QTEDIR=/opt/qt6.4.3-arm

保存退出后,使用如下命令使其生效:

source /etc/profile

3) 编译其他子模块

        a. 在QT官网下载项目需要的子模块,比如qt5compat-everywhere-src-6.5.0.tar.xz,链接如下:https://download.qt.io/official_releases/qt/6.4/6.4.3/submodules/。

        以此模块为例,介绍子模块编译方法:

        make install INSTALL_ROOT=/path/to/install/dir

  •         b. 将下载的压缩包解压到工控机中,cd到其源码目录下。

        执行命令:(不要忽略 空格 和 . 点)

        cmake .

        构建完成后,执行命令:

        make -j2

        make install INSTALL_ROOT=/opt/qt6.4.3-arm

这将会将Qt子模块的头文件和库文件安装到/path/to/install/dir/usr /include/qt5 /Qt<Module> 和 /path/to/install/dir/usr/lib/x86_64-linux-gnu/qt5/plugins/<Module>/ 目录下。这样在项目中使用 Qt 子模块时,就只可以使用 Qt +=子模块名 来使用子模块。

此时可直接进行e步骤。

        c. 如果在上一步未使用make install INSTALL_ROOT=/opt/qt6.4.3-arm,或者最终未能使用,可以尝试默认安装方式,然后进行d步骤的操作。
        d. 则子模块会默认安装到/usr/local中,需要对其进行复制,以便于开发使用:(以QtXlsx子模块为例,qt5compat等其他子模块同理)

                ·将生成的include文件夹下的QtXlsx文件夹拷贝到/opt/qt6.4.3-arm/include下(注意看头文件内容是否为头文件的相对路径,是则需要替换为包含内容的头文件)

                ·将生成的lib文件夹下Qt5Xlsxd.lib、Qt5Xlsx.lib、Qt5Xlsx.prl、Qt5Xlsxd.prl拷贝到/opt/qt6.4.3-arm/lib下

                ·将生成的lib下Qt5Xlsx.dll、Qt5Xlsxd.dll拷贝到/opt/qt6.4.3-arm/bin下

                ·将生成的mkspecs\modules-inst下qt_lib_xlsx.pri、qt_lib_xlsx_private.pri拷贝到/opt/qt6.4.3-arm/mkspecs\modules下(此步不做则pro文件中添加QT += xlsx模块不会被识别)

        e. 全部子模块安装完毕后,需重启系统更新Qt配置文件。

三、项目移植

从Windows下编写的项目移植到linux下时,需更改seetaface、OpenCV等库,将其更改为Linux版本的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言学习笔记之结构体(一)

目录 什么是结构体&#xff1f; 结构体的声明 结构体变量的定义和初始化 结构体成员的访问 结构体传参 什么是结构体&#xff1f; 在现实生活中的很多事物无法用单一类型的变量就能描述清楚&#xff0c;如&#xff1a;描述一个学生&#xff0c;需要姓名&#xff0c;年龄&a…

演示:单包攻击,扫描类攻击,畸形报文攻击[Land攻击,泪滴攻击,ip地址欺骗]。配置防火墙进行防御

浏览上篇博客进行环境搭建 单包攻击 单包攻击&#xff08;Single Packet Attack&#xff09;是一种利用网络协议或应用程序中的漏洞进行的攻击方式。这种攻击通常只需要发送一个精心构造的数据包&#xff0c;就能够触发目标系统的漏洞&#xff0c;导致攻击者能够执行非授权的…

JVM修炼之路【12】- GC调优 、性能调优

上一篇中 我们详细讲了内存溢出 内存泄漏 还有相关的案例。 这篇博客中我们主要了解一下GC调优。 有些新手可能会有一点 疑问—— 这两者不是一回事吗&#xff1f;&#xff1f; 其实说一回事 也没错 因为GC调优本质上还是针对 堆上的内存 只不过前面我们关注的侧重点在于 不合…

关于机器学习中贝叶斯学习(Bayesian Learning)计算公式的理解

一、引言 在《统计学习的分类概述》中介绍了贝叶斯学习的概念和计算公式&#xff0c;可以看到这个公式就是概率统计理论中的贝叶斯公式&#xff0c;但在机器学习中这个公式与概率统计中的理解要复杂得多。 二、贝叶斯学习公式及各组成因子的含义 要理解贝叶斯学习公式&#…

【Spring Security】1.Spring Security介绍 功能介绍

文章目录 一、Spring Security介绍二、功能介绍 一、Spring Security介绍 官方文档&#xff1a;https://docs.spring.io/spring-security/reference/index.html 官网解释&#xff1a;Spring Security 是一个提供 身份验证、授权 和 针对常见攻击的保护 的框架。 它为 保护命令…

运放噪声评估的来龙去脉

运放噪声评估的来龙去脉 友情提示&#xff0c;运放电路的噪声分析还是比较复杂的&#xff0c;不论是基础理论还是对应的推导过程&#xff0c;都不是特别容易。考虑到兄弟们的基础参差不齐&#xff0c;所以我还是尽量说清楚点&#xff0c;这样导致看起来就有点罗里吧嗦&#xff…

刷题之动态规划-回文串

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;开始刷动态规划的回文串类型相关的题目 动态规划5个步骤 状态表示 &#xff1a;dp数组中每一个下标对应值的含义是什么>dp[i]表示什么状态转移方程&#xff1a; dp[i] 等于什么1 和 2 是动态规划的核心步骤&#xff0c;…

市场复盘总结 20240412

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率 50% 最常用的二…

iOS开发之为什么需要引用计数

iOS开发之为什么需要引用计数 在iOS开发中&#xff0c;Objective-C与Swift语言都是通过引用计数进行内存管理&#xff0c;实际上Python、Ruby、C等语言也提供了基于引用计数的内存管理方式&#xff0c;它们有一个共同点&#xff0c;那就是都是面向对象的编程语言。 引用计数可…

响应式布局(其次)

响应式布局 一.响应式开发二.bootstrap前端开发框架1.原理2.优点3.版本问题4.使用&#xff08;1&#xff09;创建文件夹结构&#xff08;2&#xff09;创建html骨架结构&#xff08;3&#xff09;引入相关样式&#xff08;4&#xff09;书写内容 5.布局容器&#xff08;已经划分…

Cascader 级联选择器 - 选择器最后一级数据为空

原因&#xff1a;将扁平数据转化为树形数据时&#xff0c;给每个项都添加了 children export const transList2Tree (list, rootPid) > {const result []list.forEach(item > {if (item.pid rootPid) {const children transList2Tree(list, item.id)item.children …

c语言多功能计算软件170

定制魏&#xff1a;QTWZPW&#xff0c;获取更多源码等 目录 题目 要求 主要代码片段 题目 设计一个计算器软件&#xff0c;具备如下功能提示界面。 要求 设计出界面&#xff0c;注意界面名称最后为自己的姓名&#xff1b;&#xff08;20分&#xff09;能够实现加、减、乘、…

【Godot4.2】CanvasItem绘图函数全解析 - 3.绘制纹理

概述 前两节我们讲述了常见几何图形绘制以及对几何图形应用变换的基础知识。 本节我们来讲如何在CanvasItem中绘制纹理。 系列目录 0.概述1.绘制简单图形2.设定绘图变换3.绘制纹理4.绘制样式盒5.绘制字符和字符串6.TextLine和TextParagraph详解7.自定义节点TextBoard8.绘制点…

C语言 函数——函数封装与程序的健壮性

目录 函数封装&#xff08;Encapsulation&#xff09; 如何增强程序的健壮性&#xff1f; 如何保证不会传入负数实参&#xff1f; 函数设计的基本原则 函数封装&#xff08;Encapsulation&#xff09; 外界对函数的影响——仅限于入口参数 函数对外界的影响——仅限于一个…

MySQL前缀索引(3/16)

前缀索引 前缀索引&#xff1a;MySQL支持前缀索引&#xff0c;允许定义字符串的一部分作为索引。如果不指定前缀长度&#xff0c;索引将包含整个字符串。前缀索引可以节省空间&#xff0c;但可能会增加查询时的记录扫描次数&#xff08;因为会查询到多个前缀相同的数据&#x…

MySQL数据库的增删改查(进阶)

1.新增 将一个表中的内容插入到另一个表中. 这里需要确保查询集合的列数,类型,顺序要和插入表的列数,类型,顺序一致,这里列的名称可以不一样. values 替换成了select 查询的临时表. 2. 查询 2.1 聚合查询 2.1.1 聚合查询 函数 说明COUNT([DISTINCT] expr)返回…

python爬虫--------Beautiful Soup 案列(二十一天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

同城O2O系统搭建实战:外卖跑腿APP发全攻略

在同城服务领域&#xff0c;外卖和跑腿服务成为了人们生活中不可或缺的一部分。接下来小编将带领读者进入同城O2O系统搭建的实战领域&#xff0c;详细介绍如何打造一款外卖跑腿APP。 第一步&#xff1a;需求分析 这包括对目标用户群体的调研&#xff0c;明确用户的需求和痛点。…

FreeFileSync|本地自动备份设置教程,终于可以不用手动同步了

前言 昨天小白给各位小伙伴分享了FreeFileSync软件&#xff0c;由于篇幅过长&#xff0c;所以整个教程中并没有教小伙伴们如何设置自动同步的办法。 今天小白就来唠唠&#xff1a;如何让FreeFileSync自动同步。 教程分为几种&#xff1a; 开机自动同步 开机之后自动执行一次…

OpenHarmony南向嵌入式:【XR806开发板指导文档】

一. 简介 芯片介绍 XR806是全志科技旗下子公司广州芯之联研发设计的一款支持WiFi和BLE的高集成度无线MCU芯片&#xff0c;支持OpenHarmony轻量设置系统。具有集成度高、硬件设计简单、BOM成本低、安全可靠等优点。可广泛满足 智能家居、智慧楼宇、工业互联、儿童玩具、电子竞…