当前位置: 首页 > news >正文

信创ARM架构QT应用开发环境搭建

Linux ARM架构QT应用开发环境搭建

    • 前言
    • 交叉工具链
      • Ubuntu上安装 32 位 ARM 交叉工具链
      • Ubuntu上安装 64 位 ARM 交叉工具链
    • 交叉编译 QT 库
      • 下载 QT 源码
      • 交叉编译 QT 源码
    • Qt Creator交叉编译配置
      • 配置 Qt Creator Kits
      • 创建一个测试项目
    • 小结

前言

有没有碰到过这种情况?开发出一款软件产品,交付给客户,客户说安装不上。经过一番调查,原因让人哭笑不得,你以兆芯为目标进行开发,客户电脑却用的是华为鲲鹏。这也不能怪客户,经过多年的市场培育,在大多数人的认知里,电脑就是 Windows 系统加上英特尔处理器。

这些年国产信创 Linux 系统开始推广,才有少数人开始有了操作系统的概念,原来除了 Windows 系统之外,还有其他奇奇怪怪的系统。

不光是操作系统, CPU 也是有好多种,并不是只有英特尔兼容的 CPU 才叫 CPU。由于 Intel CPU 的封闭性,越来越多的国内厂商瞄准了 ARM。ARM 芯片虽然主要使用在手机、嵌入式系统上,但经过厂商多年的努力,ARM 芯片的性能不断提升。特别是苹果公司宣布苹果电脑全线产品改用自家的 ARM 芯片,给了市场一剂强心剂。搭载苹果 M1、M2 等芯片的 Mac 系列电脑上市后,的确带来了惊喜。换芯后的 Mac 电脑不仅性能强大,功耗还相当低。

苹果公司把路都探好了,国内厂商没有理由不跟进,纷纷推出了针对桌面系统的 ARM 芯片,比如华为鲲鹏 990。目前,搭载华为鲲鹏 990 芯片的笔记本、台式机已经上市,操作系统一般搭载麒麟或统信 UOS 操作系统。

操作系统和 CPU 打头阵,应用程序得跟上才行。如果是使用 Java、Python 等解释性语言开发的应用,只要解释器或者虚拟机进行了移植,应用程序无需修改,可以直接在新的 CPU 架构上运行。但是对于 C/C++ 等编译语言开发的应用程序,则需要重新编译,有的甚至需要重新开发。

QT 作为一种广为流行的跨平台软件开发框架,在桌面应用开发中得到广泛应用。如何将为 X86 架构开发的 QT 应用,移植到 ARM 架构的系统上,是开发人员所要面临的新课题。

本文将介绍如何将 QT 应用程序移植到 ARM 架构的 Linux 系统上,方法同样适用于 ARM 版麒麟系统和 统信 UOS 系统。

交叉工具链

开发针对 ARM 架构的 QT 应用,有两种开发模式。

第一种就是以目标机作为开发环境,比如 ARM 版麒麟系统,在上面安装编译器、IDE 工具,编写代码,并最终编译、打包。不管是 ARM 版麒麟系统还是 ARM 版统信 UOS 系统,都有完整的 GCC 工具链,编译代码没有问题,但诸如 Qt Creator 之类的 IDE 工具就不见得有。另外 ARM 版的 Linux 系统,软件不够丰富,很多软件还没有提供 ARM 版本,碰到问题也不好解决。

所以,推荐采用第二种方式,即在英特尔 CPU 的Ubuntu 系统上开发、编译、打包,最后发布到 ARM 架构的系统上。这种方式就涉及到交叉编译。

所谓交叉编译(Cross-Compilation),是指在一种计算机系统上生成可在另一种不同体系结构或操作系统上运行的代码的过程。通常情况下,交叉编译涉及将源代码从一种平台(通常是开发者的本地平台)编译成目标平台上的可执行文件或库。这种技术在嵌入式系统、移动设备、服务器和其他各种计算机领域中都非常常见。

交叉编译的第一步就是需要交叉编译器(或叫交叉编译工具链),这是一种特殊的编译器,能够在一种平台上生成另一种平台的代码。

我们需要知道,ARM CPU 也是有 32 位和 64 位之分。早期的 ARM CPU,比如广泛使用的 ARMv7 指令集,就是 32 位。ARMv8-A 架构是 ARM 的第一个支持 64 位指令集的架构,它引入了 64 位的通用寄存器和指令集,同时也保留了对 32 位指令集的兼容性。

如果你希望你的应用程序具有更好的兼容性,可以选择针对 ARM 32 位处理器的交叉编译工具链。如果你希望更好的性能,只针对 64 位 ARM 处理器开发,那优选 ARM 32 位处理器的交叉编译工具链。

Ubuntu上安装 32 位 ARM 交叉工具链

在Ubuntu 上安装 ARM 交叉工具链,推荐直接使用 apt 包管理器。

首先,打开终端并更新软件包列表:

sudo apt update

然后安装 ARM 架构的交叉编译器工具链:

sudo apt install gcc-arm-linux-gnueabi

这将安装 GNU 工具链,其中包括了用于 ARM 架构的交叉编译器。

安装完毕后,你可以在终端中输入 arm-linux-gnueabi-gcc -v 命令验证:

$ arm-linux-gnueabi-gcc -v
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/arm-linux-gnueabi/9/lto-wrapper
Target: arm-linux-gnueabi
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04.2' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libitm --disable-libquadmath --disable-libquadmath-support --enable-plugin --with-system-zlib --without-target-system-zlib --enable-libpth-m2 --enable-multiarch --enable-multilib --disable-sjlj-exceptions --with-specs='%{mfloat-abi=hard:-march=armv7-a -mcpu=generic-armv7-a -mfloat-abi=hard}' --with-arch=armv5t --with-float=soft --disable-werror --enable-multilib --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=arm-linux-gnueabi --program-prefix=arm-linux-gnueabi- --includedir=/usr/arm-linux-gnueabi/include
Thread model: posix
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)

某些 CPU 厂家可能提供了针对自家 CPU 优化的 GCC 交叉工具链,请参考提供的文档进行安装和配置。

Ubuntu上安装 64 位 ARM 交叉工具链

步骤和 32 位交叉工具链的安装类似。两种交叉工具链是可以同时安装的。ARM 64 位架构也被称为 AArch64。

  1. 打开终端并更新软件包列表:
sudo apt update
  1. 安装 ARM 64 位架构的交叉编译器工具链:
sudo apt install gcc-aarch64-linux-gnu
  1. 验证安装
$ aarch64-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/aarch64-linux-gnu/9/lto-wrapper
Target: aarch64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04.2' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --without-target-system-zlib --enable-libpth-m2 --enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=aarch64-linux-gnu --program-prefix=aarch64-linux-gnu- --includedir=/usr/aarch64-linux-gnu/include
Thread model: posix
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2) 

交叉编译 QT 库

QT 应用程序的开发离不开 QT 库。虽然麒麟系统和统信 UOS 系统都带有 QT 库(ARM 版带的是 ARM 架构的 QT 库),直接使用麒麟系统或统信 UOS 系统的 QT 库最简单。但有几种情况可能会需要你编译自己的 QT 库。

  1. 麒麟系统和统信 UOS 系统带的 QT 库版本不同,你希望应用程序能同时运行在多种系统上,而不是每个系统开发一个版本。
  2. 你已经为其它平台,如 Window、Mac OS 开发了 QT 应用程序,当时已经选择了 QT 的某个版本。为了代码跨平台,你希望选择同一版本的 QT。
  3. 你希望使用较新版本的 QT,而麒麟系统或统信 UOS 系统的 QT 库相对较老。

下载 QT 源码

QT 系统庞大而且复杂,除了 QT 框架,还有 QT Creator、QT Designer 之类的开发工具,所以要看准 QT 库,不要下错了。QT 库的链接:

https://download.qt.io/archive/qt/

选择你要使用的 QT 版本。在本专栏中,我都是使用 5.15.2 这个版本,这是一个 LTS(长期支持) 版本,也是最后一个支持 Windows 7 的版本。

先点击 5.15 这个链接,接下来点击 5.15.2 这个链接,再点击 single 链接,进入源码下载:
在这里插入图片描述
根据喜好选择 zip 包或者 tar 包,下载其中一个即可。

这里以 qt-everywhere-src-5.15.2.tar.xz 为例。

交叉编译 QT 源码

  1. 解压 QT 源码
tar xvf qt-everywhere-src-5.15.2.tar.xz

可以看到 qt-everywhere 源码中包含了几乎所有的 QT 模块。
在这里插入图片描述
2. 配置编译选项

配置编译选项有很多,可以使用如下的命令查看编译选项:

$ ./configure -h

因为选项很多,这里不一一解释,只说明一下我要修改的选项,其它的使用默认值。

-prefix <dir> 编译后的库文件安装路径前缀,一般是 /usr/local/Qt-$QT_VERSION,我不希望将 ARM版 QT 安装到系统目录,避免和 x86 版的 QT 混淆,所以指定别的路径。
-xplatform <target> 选择交叉工具链,这里使用 linux-arm-gnueabi-g++
-opensource 构建开源版 QT
-confirm-license 自动确认许可证
-no-opengl 禁用 OpenGL 支持
-skip <module> 如果某个模块不需要或编译不过,可以先不编译

最终的配置命令为:

./configure -prefix /work/mywork/qt-in-action/qt-arm -xplatform linux-arm-gnueabi-g++ -opensource -confirm-license -no-opengl -skip location
  1. 编译

根据你的 CPU 核数量决定并行编译的任务数,不确定的话不需要带 -j 参数:

make -j12

这个编译过程会比较长,先喝杯咖啡吧!

  1. 安装
make install

我之前指定的安装路径是 /work/mywork/qt-in-action/qt-arm,进入到这个目录,可以看到如下文件:
在这里插入图片描述
其中 include 为头文件,lib 为编译出来的 QT 库,开发 ARM 架构 QT 应用程序主要用到这两个目录下的文件。我们可以查看一下 Qt 库文件的信息:

$ file libQt5Core.so.5.15.2
libQt5Core.so.5.15.2: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, for GNU/Linux 3.17.0, BuildID[sha1]=17cb846340306bae3fca72a8e65189b775cc7f02, stripped

可以看出,确实是 ARM 架构的库文件。

Qt Creator交叉编译配置

开发 QT 应用程序,最推荐 Qt Creator。虽然有 VS Code 这样的万能开发工具,但 Qt Creator 速度快,集成源码编译、调试,使用起来更顺手。

Qt Creator 默认使用的是系统工具链,要支持开发 ARM 应用程序,还需要配置交叉工具链。

配置 Qt Creator Kits

打开 Qt Creator,然后点击菜单项 Tool | Option
在这里插入图片描述
点击左上的 Kits,然后点击 Qt Versions,接着点击 Add
在这里插入图片描述
在弹出的文件选择对话框中,选择上一步所编译出的 Qt qmake 文件(在 bin 目录下)。
在这里插入图片描述
接下来配置编译器。
在这里插入图片描述
主要是要设置编译器的路径,这里使用系统的交叉工具链,然后点击 Apply
在这里插入图片描述
再点击 Kits Tab,然后点击右边的 Add。
在这里插入图片描述
指定一个名称,C++ 编译器选择前面配置的 ARM-GCC,Qt Version 选择全面配置的 Qt 5.15.2(qt-arm),然后点击 OK,大功告成。
在这里插入图片描述

创建一个测试项目

Qt环境搭建好了,可以新建一个项目试试。

点击菜单项 File | New File or Project … ,打开新建工程向导。这里新建一个 Qt GUI 应用程序。
在这里插入图片描述
项目命名为 FirstArmApp,指定项目目录。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这一步 Kit Selection,要选择我们在上一步新建的 Kit ARM Qt 5.15.2。
在这里插入图片描述
在这里插入图片描述
项目建立起来后,可以右键点击项目,然后点击 Build
在这里插入图片描述
项目构建完毕后,我们可以在 build-FirstArmApp-ARM_Qt_5_15_2-Debug 目录看到我们编译出来的第一个 QT ARM 应用程序。

需要注意的是,这个编译出来的 QT 应用程序不能直接在 X86 的 Ubuntu 系统上运行,CPU 架构不同,我们可以查看文件信息。
在这里插入图片描述
把这个应用程序复制到 ARM 版的麒麟或 UOS 系统上,就可以运行。

小结

本文首先介绍了交叉编译的概念,接着介绍了在 Ubuntu Linux 系统上安装 ARM 交叉编译工具链,并使用 ARM 交叉编译工具链编译 QT 源码,得到了 ARM 版的 QT 库,最后介绍在 Qt Creator 中配置交叉工具链,并使用配置的交叉工具链编译出第一个 ARM 架构 QT 应用程序。

相关文章:

信创ARM架构QT应用开发环境搭建

Linux ARM架构QT应用开发环境搭建 前言交叉工具链Ubuntu上安装 32 位 ARM 交叉工具链Ubuntu上安装 64 位 ARM 交叉工具链 交叉编译 QT 库下载 QT 源码交叉编译 QT 源码 Qt Creator交叉编译配置配置 Qt Creator Kits创建一个测试项目 小结 前言 有没有碰到过这种情况&#xff1…...

使用SPM_batch进行批量跑脚本(matlab.m)

软件&#xff1a;spm8matlab2023bwin11 数据格式&#xff1a; F:\ASL\HC\CBF\HC_caishaoqing\CBF.nii F:\ASL\HC\CBF\HC_caishaoqing\T1.nii F:\ASL\HC\CBF\HC_wangdonga\CBF.nii F:\ASL\HC\CBF\HC_wangdonga\T1.nii clear spmdirD:\AnalysisApps\spm8; datadirF:\ASL\HC\CBF…...

力扣0124——二叉树的最大路径和

二叉树的最大路径和 难度&#xff1a;困难 题目描述 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点…...

c# 字符串帮助类

public class StringHelper { #region 全角半角互相转换 /// <summary> /// 转全角的函数(SBC case) /// </summary> /// <param name"str">任意字符串</param> /// <returns>全…...

LabVIEW双光子荧光显微成像系统开发

双光子显微成像是一种高级荧光显微技术&#xff0c;广泛用于生物学和医学研究&#xff0c;尤其是用于活体组织的深层成像。在双光子成像过程中&#xff0c;振镜&#xff08;Galvo镜&#xff09;扮演了非常关键的角色&#xff0c;它负责精确控制激光束在样本上的扫描路径。以下是…...

Prim模板

通过代码探索Prim算法&#xff1a;最小生成树之旅 在计算机科学领域&#xff0c;图算法占据了至关重要的位置&#xff0c;尤其是在设计高效的网络&#xff08;无论是社交网络、计算机网络还是交通网&#xff09;时。在这些算法中&#xff0c;寻找最小生成树&#xff08;MST&am…...

CSS之盒子模型

盒子模型 01-选择器 结构伪类选择器 基本使用 作用&#xff1a;根据元素的结构关系查找元素。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IE…...

Linux系统安装(CentOS Vmware)

学习环境安装 VMware安装 VMware下载&安装 访问官网&#xff1a;https://www.vmware.com 在此处可以选择语言 点击China&#xff08;简体中文&#xff09; 点击产品&#xff0c;点击Workstation Pro 下滑&#xff0c;点击下载试用版 下滑找到Workstation 17 Pro for Wi…...

STM32 硬件随机数发生器(RNG)

STM32 硬件随机数发生器 文章目录 STM32 硬件随机数发生器前言第1章 随机数发生器简介1.1 RNG主要特性1.2.RNG应用 第2章 RNG原理框图第3章 RNG相关寄存器3.1 RNG 控制寄存器 (RNG_CR)3.2 RNG 状态寄存器 (RNG_SR)3.3 RNG 数据寄存器 (RNG_DR) 第3章 RNG代码部分第4章 STM32F1 …...

Window环境下使用go编译grpc最新教程

网上的grpc教程都或多或少有些老或者有些问题&#xff0c;导致最后执行生成文件时会报很多错。这里给出个人实践出可执行的编译命令与碰到的报错与解决方法。&#xff08;ps:本文代码按照煎鱼的教程编写&#xff1a;4.2 gRPC Client and Server - 跟煎鱼学 Go (gitbook.io)&…...

STM32——FLASH(1)简单介绍、分类、读写流程及注意事项

文章目录 FLASH的特点Nor flash和nand flashflash的读写flash 的存储单位 flash的读写过程 FLASH的特点 可擦写数据可修改可重写访问速度<ROM Nor flash和nand flash Nor flash 1、与SDRAM相似&#xff0c;用户可以直接运行装载到NORFLASH里面的代码&#xff0c;减少SRAM…...

MySQL的DML语言

DML&#xff1a;Data Manipulation Language&#xff08;数据操作语言&#xff09; DML语言用来对数据库中表的数据记录进行增、删、改操作。 一、添加数据命令 注意&#xff1a; 插入数据时&#xff0c;指定的字段顺序需要与值的顺序是一一对应的。 字符串和日期型数据应该包…...

Vivado-IP核

Vivado-IP核 主程序 timescale 1ns / 1ps ////module ip_clk_wiz(input sys_clk,input sys_rst_n,output clk_out1,output clk_out2,output clk_out3,output clk_out4,output locked);clk_wiz_0 instance_name(// Clock out ports.clk_out1(clk_out1), // output clk_out…...

品牌如何营造生活感氛围?媒介盒子分享

「生活感」简而言之是指人们对生活的感受和意义&#xff0c;它往往没有充斥在各种重要的场合和事件中&#xff0c;而是更隐藏在细碎平凡的生活场景中。在营销越来越同质化的当下&#xff0c;品牌应该如何打破常规模式&#xff0c;洞察消费情绪&#xff0c;找到更能打动消费者心…...

Java 学习和实践笔记(2)

今天的学习进度&#xff1a; 注册并下载安装好了Java 8&#xff0c;之后进行以下配置。 1&#xff09;path 是一个常见的环境变量&#xff0c;它告诉系统除了在当前的目标下妹寻找此程序外&#xff0c;还可以到path指定的目录下找。这句话是什么意思呢&#xff1f;以下举报例…...

Python:批量url链接保存为PDF

我的数据是先把url链接获取到存入excel中&#xff0c;后续对excel做的处理&#xff0c;各位也可以直接在程序中做处理&#xff0c;下面就是针对excel中的链接做批量处理 excel内容格式如下&#xff08;涉及具体数据做了隐藏&#xff09; 标题文件链接文件日期网页标题1http://…...

【LeetCode每日一题】525连续数组 303区域和检索(前缀和的基本概念和3个简单案例)

前缀和 // 构造prefix let prefix [0] arr.forEach(num > {prefix.push(prefix.at(-1) num); })如果想要计算某个区间 i 到 j 这个子数组的和时&#xff0c;可以根据 prefix[j1] - prefix[i] 获得。 例题1&#xff1a;303.区域和检索 - 数组不可变 给定一个整数数组 num…...

形态学算法应用之连通分量提取的python实现——图像处理

原理 连通分量提取是图像处理和计算机视觉中的一项基本任务&#xff0c;旨在识别图像中所有连通区域&#xff0c;并将它们作为独立对象处理。在二值图像中&#xff0c;连通分量通常指的是所有连接在一起的前景像素集合。这里的“连接”可以根据四连通或八连通的邻接关系来定义…...

Kafka系列之:Kafka集群同时设置基于时间和日志大小两种方式保存Topic的数据

Kafka系列之:Kafka集群同时设置基于时间和日志大小两种方式保存Topic的数据 一、基于日志大小二、基于时间大小三、参数设置四、设置命令一、基于日志大小 "log.retention.bytes"是Apache Kafka中的一项配置参数,用于指定每个日志段文件的最大大小。当日志段文件的…...

pytest+allure批量执行测试用例

在 Pytest 中,可以使用装饰器 `@pytest.fixture` 来定义用例级别的前置和后置操作。下面是一个示例代码,演示了如何使用 Pytest 的前置和后置操作: ```python import pytest @pytest.fixture(scope="function") def setup_function(): print("Setup fu…...

SpringBoot和SpringMVC

目录 一、springboot项目 &#xff08;1&#xff09;创建springboot项目 &#xff08;2&#xff09;目录介绍 &#xff08;3&#xff09;项目启动 &#xff08;4&#xff09;运行一个程序 &#xff08;5&#xff09;通过其他方式创建和运行springboot项目 二、SpringMVC…...

免费搭建幻兽帕鲁服务器,白嫖阿里云游戏服务器

阿里云幻兽帕鲁服务器免费搭建方案&#xff0c;先在阿里云高校计划「云工开物」活动领取学生专享300元无门槛代金券&#xff0c;幻兽帕鲁专用服务器4核16G配置26元1个月、149元半年&#xff0c;直接使用这个无门槛300元代金券抵扣即可免费搭建幻兽帕鲁服务器。阿里云服务器网al…...

[技术杂谈]如何下载vscode历史版本

网站模板&#xff1a; https://code.visualstudio.com/updates/v1_85 如果你想下载1.84系列可以访问https://code.visualstudio.com/updates/v1_84​​​​​​ 然后看到&#xff1a; 选择对应版本下载即可&#xff0c;我是windows x64系统选择x64即可开始下载...

nginx slice模块的使用和源码分析

文章目录 1. 为什么需要ngx_http_slice_module2. 配置指令3. 加载模块4. 源码分析4.1 指令分析4.2 模块初始化4.3 slice模块的上下文4.2 $slice_range字段值获取4.3 http header过滤处理4.4 http body过滤处理5 测试和验证 1. 为什么需要ngx_http_slice_module 顾名思义&#…...

AI应用开发-python实现redis数据存储

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…...

2024年Java架构篇之设计模式

2024年Java实战面试题_java 5 年 面试-CSDN博客 1、单例模式...

搭建macOS开发环境-1:准备工作

请记住&#xff1a; 最重要的准备工作永远是&#xff1a;备份数据 !!! 通过图形界面检查 Mac 的 CPU 类型&#xff1a; 在搭载 Apple 芯片的 Mac 电脑上&#xff0c;“关于本机”会显示一个标有“芯片”的项目并跟有相应芯片的名称&#xff1a; 通过命令行检查Mac的CPU类型 …...

【Makefile语法 02】Makefile语法基础

目录 一、Makefile概述 二、Makefile变量 三、Makefile符号 一、Makefile格式 1. 基本格式&#xff1a; targets : prerequisties [tab键]command target&#xff1a;目标文件&#xff0c;可以是 OjectFile&#xff0c;也可以是执行文件&#xff0c;还可以是一个标签&…...

如何写一个其他人可以使用的GitHub Action

前言 在GitHub中&#xff0c;你肯定会使用GitHub Actions自动部署一个项目到GitHub Page上&#xff0c;在这个过程中总要使用workflows工作流&#xff0c;并在其中使用action&#xff0c;在这个使用的过程中&#xff0c;总会好奇怎么去写一个action呢&#xff0c;所以&#xff…...

排序算法的时间复杂度存在下界问题

对于几种常用的排序算法&#xff0c;无论是归并排序、快速排序、以及更加常见的冒泡排序等&#xff0c;这些排序算法的时间复杂度都是大于等于O(n*lg(n))的&#xff0c;而这些排序算法存在一个共同的行为&#xff0c;那就是这些算法在对元素进行排序的时候&#xff0c;都会进行…...

详解洛谷P2016 战略游戏/BZOJ0495. 树的最小点覆盖之战略游戏(贪心/树形DP)

Description Bob喜欢玩电脑游戏&#xff0c;特别是战略游戏。但是他经常无法找到快速玩过游戏的办法。现在他有个问题。 他要建立一个古城堡&#xff0c;城堡中的路形成一棵树。他要在这棵树的结点上放置最少数目的士兵&#xff0c;使得这些士兵能了望到所有的路。 注意&…...

解决The Tomcat connector configured to listen on port 8080 failed to start

问题 启动javar报错&#xff0c;提示如下 Description: The Tomcat connector configured to listen on port 8080 failed to start. The port may already be in use or the connector may be misconfigured. Action: Verify the connector’s configuration, identify a…...

深度学习自然语言处理(NLP)模型BERT:从理论到Pytorch实战

文章目录 深度学习自然语言处理&#xff08;NLP&#xff09;模型BERT&#xff1a;从理论到Pytorch实战一、引言传统NLP技术概览规则和模式匹配基于统计的方法词嵌入和分布式表示循环神经网络&#xff08;RNN&#xff09;与长短时记忆网络&#xff08;LSTM&#xff09;Transform…...

C语言的循环结构

目录 前言 1.三种循环语句 1.while循环 2.for循环 2.1缺少表达式的情况 3.do while循环 2.break语句和continue语句 2.1在while循环中 2.2在for循环中 2.3在do while 循环中 3.循环的嵌套 4.go to语句 前言 C语⾔是结构化的程序设计语⾔&#xff0c;这⾥的结构指的是…...

C#用Array类的FindAll方法和List<T>类的Add方法按关键词在数组中检索元素并输出

目录 一、使用的方法 1. Array.FindAll(T[], Predicate) 方法 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;示例 2.List类的常用方法 &#xff08;1&#xff09;List.Add(T) 方法 &#xff08;2&#xff09;List.RemoveAt(Int32) 方法 &#xff08;3&…...

【前后端接口AES+RSA混合加解密详解(vue+SpringBoot)附完整源码】

前后端接口AES+RSA混合加解密详解(vue+SpringBoot) 前后端接口AES+RSA混合加解密一、AES加密原理和为什么不使用AES加密二、RSA加密原理和为什么不使用rsa加密三、AES和RSA混合加密的原理四、代码样例前端1. 请求增加加密标识2. 前端加密工具类3.前端axios请求统一封装,和返…...

React环境配置

1.安装Node.js Node.js官网&#xff1a;https://nodejs.org/en/ 下载之后按默认选项安装好 重启电脑即可自动完成配置 2.安装React 国内使用 npm 速度很慢&#xff0c;可以使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm。 ①使用 winR 输入 cmd 打开终端 ②依…...

Pandas 数据处理-排序与排名的深度探索【第69篇—python:文本数据处理】

文章目录 Pandas 数据处理-排序与排名的深度探索1. sort_index方法2. sort_values方法3. rank方法4. 多列排序5. 排名方法的参数详解6. 处理重复值7. 对索引进行排名8. 多级索引排序与排名9. 更高级的排序自定义10. 性能优化技巧10.1 使用nsmallest和nlargest10.2 使用sort_val…...

第8节、双电机多段直线运动【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;前面章节主要介绍了bresenham直线插值运动&#xff0c;本节内容介绍让两个电机完成连续的直线运动,目标是画一个正五角星 一、五角星图介绍 五角星总共10条直线&#xff0c;10个顶点。设定左下角为原点…...

Elasticsearch:基本 CRUD 操作 - Python

在我之前的文章 “Elasticsearch&#xff1a;关于在 Python 中使用 Elasticsearch 你需要知道的一切 - 8.x”&#xff0c;我详细讲述了如何建立 Elasticsearch 的客户端连接。我们也详述了如何对数据的写入及一些基本操作。在今天的文章中&#xff0c;我们针对数据的 CRUD (cre…...

1992-2022年全国及31省对外开放度测算数据(含原始数据+计算结果)(无缺失)

1992-2022年全国及31省对外开放度测算数据&#xff08;含原始数据计算结果&#xff09;&#xff08;无缺失&#xff09; 1、时间&#xff1a;1992-2022年 2、来源&#xff1a;各省年鉴、国家统计局、统计公报、 3、指标&#xff1a;进出口总额&#xff08;万美元&#xff09…...

JVM之GC垃圾回收

GC垃圾回收 如何判断对象可以回收 引用计数法 如果有对象引用计数加一&#xff0c;没有对象引用&#xff0c;计数减一&#xff0c;如果计数为零&#xff0c;则回收 但是如果存在循环引用&#xff0c;即A对象引用B对象&#xff0c;B对象引用A对象&#xff0c;会造成内存泄漏 可…...

自然语言学习nlp 六

https://www.bilibili.com/video/BV1UG411p7zv?p118 Delta Tuning&#xff0c;尤其是在自然语言处理&#xff08;NLP&#xff09;和机器学习领域中&#xff0c;通常指的是对预训练模型进行微调的一种策略。这种策略不是直接更新整个预训练模型的权重&#xff0c;而是仅针对模型…...

fpga 需要掌握哪些基础知识?

个人根据自己的一些心得总结一下fpga 需要掌握的基础知识&#xff0c;希望对你有帮助。 1、数电&#xff08;必须掌握的基础&#xff09;&#xff0c;然后进阶学模电&#xff0c; 2、掌握HDL&#xff08;verilog或VHDL&#xff09;一般建议先学verilog&#xff0c;然后可以学…...

Qt未来市场洞察

跨平台开发&#xff1a;Qt作为一种跨平台的开发框架&#xff0c;具有良好的适应性和灵活性&#xff0c;未来将继续受到广泛应用。随着多设备和多平台应用的增加&#xff0c;Qt的前景在跨平台开发领域将更加广阔。 物联网应用&#xff1a;由于Qt对嵌入式系统和物联网应用的良好支…...

GPT-4模型中的token和Tokenization概念介绍

Token从字面意思上看是游戏代币&#xff0c;用在深度学习中的自然语言处理领域中时&#xff0c;代表着输入文字序列的“代币化”。那么海量语料中的文字序列&#xff0c;就可以转化为海量的代币&#xff0c;用来训练我们的模型。这样我们就能够理解“用于GPT-4训练的token数量大…...

宽字节注入漏洞原理以及修复方法

漏洞名称:宽字节注入 漏洞描述: 宽字节注入是相对于单字节注入而言的&#xff0c;该注入跟HTML页面编码无关&#xff0c;宽字节注入常见于mysql中&#xff0c;GB2312、GBK、GB18030、BIG5、Shift_JIS等这些都是常说的宽字节&#xff0c;实际上只有两字节。宽字节带来的安全问…...

【Linux】SystemV IPC

进程间通信 一、SystemV 共享内存1. 共享内存原理2. 系统调用接口&#xff08;1&#xff09;创建共享内存&#xff08;2&#xff09;形成 key&#xff08;3&#xff09;测试接口&#xff08;4&#xff09;关联进程&#xff08;5&#xff09;取消关联&#xff08;6&#xff09;释…...

iview 页面中判断溢出才使用Tooltip组件

使用方法 <TextTooltip :content"contentValue"></TextTooltip> 给Tooltip再包装一下 <template><Tooltip transfer :content"content" :theme"theme" :disabled"!showTooltip" :max-width"300" :p…...

如何使用websocket

如何使用websocket 之前看到过一个面试题&#xff1a;吃饭点餐的小程序里&#xff0c;同一桌的用户点餐菜单如何做到的实时同步&#xff1f; 答案就是&#xff1a;使用websocket使数据变动时服务端实时推送消息给其他用户。 最近在我们自己的项目中我也遇到了类似问题&#xf…...