【OrangePi Zero2的系统移植】交叉编译工具链配置、wiringOP库、智能分类工程代码

一、交叉编译工具链配置
二、交叉编译wiringOP库
三、交叉编译智能分类工程代码
四、Makefile 用于编译 WiringPi 库

一、交叉编译工具链配置

1、关于编译

编译是指将源代码文件(如C/C++文件)经过预处理、编译、汇编和链接等步骤,转换为可执行文件的过
程。将源代码转换成机器代码的过程称为编译(Compile),编译的工作需要编译器(Complier)来完
成。

2、本地编译

本地编译是指在当前的编译平台上,生成能在当前平台上运行的可执行文件。例如,在x86平台上,使用
x86平台上的工具,开发针对x86平台本身的可执行程序,这个编译过程称为本地编译。

以一个简单的例子来说明本地编译,假设有一个hello.c文件,它包含以下内容:

#include <stdio.h>int main()
{printf("Hello, world!\n");return 0;
}

我们想要在x86平台上进行本地编译,并在x86平台上运行这个程序。可以使用以下命令:

gcc -o hello hello.c

运行:

./hello

输出结果为:

Hello, world!

3、交叉编译

交叉编译是指在当前的编译平台上,生成能在体系结构不同的另一种目标平台上运行的可执行文件。例
如,在x86平台上,使用针对ARM平台的工具,开发针对ARM平台的可执行程序,这个编译过程称为交
叉编译。

以一个简单的例子来说明本地编译,假设有一个hello.c文件,它包含以下内容:

#include <stdio.h>int main()
{printf("Hello, world!\n");return 0;
}

想要在x86平台上进行交叉编译,并在ARM平台上运行这个程序。首先需要在家目录下的.bashrc最后配
置添加交叉编译工具链:

test@test:~$ vi .bashrc

最后面添加

export PATH=$PATH:/home/$(whoami)/orangepi-build/toolchains/gcc-arm-9.2-2019.12-
x86_64-aarch64-none-linux-gnu/bin

然后断开重连桌重新登陆后, 执行export指令,即可看到最新导入的PATH环境变量

test@test:~$ export
declare -x DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus"
declare -x DISPLAY="localhost:10.0"
declare -x HOME="/home/pg"
declare -x LANG="en_US.UTF-8"
declare -x LC_ADDRESS="zh_CN.UTF-8"
declare -x LC_IDENTIFICATION="zh_CN.UTF-8"
declare -x LC_MEASUREMENT="zh_CN.UTF-8"
declare -x LC_MONETARY="zh_CN.UTF-8"
declare -x LC_NAME="zh_CN.UTF-8"
declare -x LC_NUMERIC="zh_CN.UTF-8"
declare -x LC_PAPER="zh_CN.UTF-8"
declare -x LC_TELEPHONE="zh_CN.UTF-8"
declare -x LC_TIME="zh_CN.UTF-8"
declare -x LESSCLOSE="/usr/bin/lesspipe %s %s"
declare -x LESSOPEN="| /usr/bin/lesspipe %s"
declare -x LOGNAME="pg"
declare -x MOTD_SHOWN="pam"
declare -x OLDPWD="/home/pg/orangepi-build/toolchains/gcc-arm-9.2-2019.12-x86_64-
aarch64-none-linux-gnu/bin"
declare -x
PATH="/home/pg/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin
:/bin:/usr/games:/usr/local/games:/snap/bin:/home/pg/orangepibuild/toolchains/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linuxgnu/bin:/home/pg/orangepi-build/toolchains/gcc-arm-9.2-2019.12-x86_64-aarch64-
none-linux-gnu/bin"

同时执行aarch64-none-linux-gnu-gcc --version 可以看到对应的版本号:

test@test:~$ aarch64-none-linux-gnu-gcc --version
aarch64-none-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 9.2-
2019.12 (arm-9.10)) 9.2.1 20191025
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

在x86平台上进行交叉编译,可以使用以下命令:

aarch64-none-linux-gnu-gcc -o hello hello.c

利用file命令可以看到编译出来的程序是ARM aarch64的二进制程序

test@test:~/test$ file hello
hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically
linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, with
debug_info, not stripped

这时候需要将该文件拷贝到比如香橙派等ARM开发板上运行, 在X86宿主机上是无法正常运行的。

scp hello orangepi@192.168.1.28:/home/orangepi

二、交叉编译wiringOP库

在之前《3.1 wiringPi外设SDK安装》里,我们是直接在香橙派里直接编译的wiringOP库,这一节讲解利
用《6.2交叉编译工具链配置》配置出来的交叉编译工具编译一直wiringOP库。

  1. 修改build.sh脚本,在echo “WiringPi Library” 之前添加:
mkdir $PWD/_INSTALL/usr/local/bin -p
mkdir $PWD/_INSTALL/usr/local/include -p
mkdir $PWD/_INSTALL/usr/local/lib -p
  1. 修改devLib/Makefile、gpio/Makefile、wiringPiD/Makefile
将所有Makefile中的CC := gcc 改成 CC := aarch64-none-linux-gnu-gcc
  1. 修改devLib/Makefile、gpio/Makefile、wiringPiD/Makefile 、wiringPi/Makefile
修改DESTDIR?=/usr 替换为DESTDIR?= $(shell pwd)/../_INSTALL/usr
  1. 修改wiringPi/Makefile
将$Q ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION)
$(DESTDIR)/lib/libwiringPi.so修改为:$Q ln -sf
$(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION)
$(DESTDIR)$(PREFIX)/lib/libwiringPi.so

修改devLib/Makefile

将$Q ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPiDev.so.$(VERSION)
$(DESTDIR)/lib/libwiringPiDev.so修改为:$Q ln -sf
$(DESTDIR)$(PREFIX)/lib/libwiringPiDev.so.$(VERSION)
$(DESTDIR)$(PREFIX)/lib/libwiringPiDev.so
  1. devLib/Makefile
INCLUDE = -I. 修改为INCLUDE = -I. -I$(DESTDIR)$(PREFIX)/include
  1. 然后执行:
./build

然后输入26(选择板子为修改DESTDIR?=/usr 替换为orangepizero2)

这时候,就会wiringOP-master下生成_INSTALL目录,里面有完整编译出来的库文件和头文件

test@test:~/test/wiringOP-master/_INSTALL$ tree -a
.
└── usr└── local├── bin│ 	└── gpio├── include│ 	├── ads1115.h│ 	├── bmp180.h│ 	├── drcNet.h│ 	├── drcSerial.h│ 	├── ds1302.h│ 	├── ds18b20.h│ 	├── font.h│ 	├── gertboard.h│ 	├── htu21d.h│ 	├── lcd128x64.h│ 	├── lcd.h│ 	├── max31855.h│ 	├── max5322.h│ 	├── maxdetect.h│ 	├── mcp23008.h│ 	├── mcp23016.h│	├── mcp23016reg.h│ 	├── mcp23017.h│ 	├── mcp23s08.h│ 	├── mcp23s17.h│ 	├── mcp23x0817.h│ 	├── mcp23x08.h│ 	├── mcp3002.h│ 	├── mcp3004.h│ 	├── mcp3422.h│ 	├── mcp4802.h│ 	├── oled.h│ 	├── OrangePi.h│ 	├── pcf8574.h│ 	├── pcf8591.h│ 	├── piFace.h│ 	├── piGlow.h│ 	├── piNes.h│ 	├── pseudoPins.h│ 	├── rht03.h│ 	├── scrollPhat.h│ 	├── sn3218.h│ 	├── softPwm.h│ 	├── softServo.h│ 	├── softTone.h│ 	├── sr595.h│ 	├── w25q64.h│ 	├── wiringPi.h│ 	├── wiringPiI2C.h│ 	├── wiringPiSPI.h│ 	├── wiringSerial.h│ 	├── wiringShift.h│ 	└── wpiExtensions.h├── lib│ 	├── libwiringPiDev.so -> /home/pg/test/wiringOPmaster/devLib/../_INSTALL/usr/local/lib/libwiringPiDev.so.2.46│ 	├── libwiringPiDev.so.2.46│ 	├── libwiringPi.so -> /home/pg/test/wiringOPmaster/wiringPi/../_INSTALL/usr/local/lib/libwiringPi.so.2.46│ 	└── libwiringPi.so.2.46└── share└── man└── man1└── gpio.1

后面我们就可以把_INSTALL里的内容拷贝到香橙派的根目录下,然后执行

sudo ldconfig

就可以使用该库了,可以使用

sudo gpio readall

测试库是否链接正常。

三、交叉编译智能分类工程代码

原有项目的目录结构为

test@test:~/garbage$ tree
.
├── garbage.c
├── garbage.h
├── garbage.py
├── main.c
├── myoled.c
├── myoled.h
├── pwm.c
├── pwm.h
├── socket.c
├── socket.h
├── uartTool.c
└── uartTool.h

调整目录结构:

test@test:~/garbage$ tree -a
.
├── inc
│ ├── garbage.h
│ ├── myoled.h
│ ├── pwm.h
│ ├── socket.h
│ └── uartTool.h
├── src
│ ├── garbage.c
│ ├── garbage.py
│ ├── main.c
│ ├── myoled.c
│ ├── pwm.c
│ ├── socket.c
│ └── uartTool.c

增加3rd目录,用于存放wiringOP和python3.10等第三方依赖库和头文件。需增加如下几个依赖库.

首先,从香橙派上利用apt download下载依赖包的头文件和库文件,并拷贝到宿主机里:

apt download zlib1g zlib1g-dev libpython3.10 libpython3.10-dev libexpat1
libexpat1-dev libcrypt1 libcrypt-dev
scp *.deb test@192.168.1.10:/home/test #test为宿主机用户名, 192.168.1.10为宿主机ip

然后,利用dpkg -x命令解压deb文件到garbage/3rd目录下:

dpkg -x libpython3.10_3.10.12-1~22.04.2_arm64.deb garbage/3rd
dpkg -x libpython3.10-dev_3.10.12-1~22.04.2_arm64.deb garbage/3rd/
dpkg -x libcrypt1_1%3a4.4.27-1_arm64.deb garbage/3rd/
dpkg -x libexpat1_2.4.7-1ubuntu0.2_arm64.deb garbage/3rd/
dpkg -x libpython3.10-dev_3.10.12-1~22.04.2_arm64.deb garbage/3rd/
dpkg -x libpython3.10_3.10.12-1~22.04.2_arm64.deb garbage/3rd
dpkg -x libexpat1_2.4.7-1ubuntu0.2_arm64.deb garbage/3rd/
dpkg -x libexpat1-dev_2.4.7-1ubuntu0.2_arm64.deb garbage/3rd/
dpkg -x libcrypt1_1%3a4.4.27-1_arm64.deb garbage/3rd/
dpkg -x zlib1g_1%3a1.2.11.dfsg-2ubuntu9.2_arm64.deb garbage/3rd/
dpkg -x libcrypt-dev_1%3a4.4.27-1_arm64.deb garbage/3rd/
dpkg -x zlib1g-dev_1%3a1.2.11.dfsg-2ubuntu9.2_arm64.deb garbage/3rd/

因为默认提供的aarch64-none-linux-gnu-gcc 9.2.0的版本编译是, 如果去加载上面的依赖库是, 会出
现库版本的依赖问题, 因此。 宿主机安装aarch64-linux-gnu-gc 11.2版本并使用该交叉编译工具:

sudo apt intall gcc-aarch64-linux-gnu

Makefile 文件内容如下:

CC := aarch64-linux-gnu-gcc
SRC := $(shell find src -name "*.c")
INC := ./inc \./3rd/usr/local/include \./3rd/usr/include \./3rd/usr/include/python3.10 \./3rd/usr/include/aarch64-linux-gnu/python3.10 \./3rd/usr/include/aarch64-linux-gnuOBJ := $(subst src/,obj/,$(SRC:.c=.o))TARGET=obj/garbageCFLAGS := $(foreach item, $(INC),-I$(item)) # -I./inc -I./3rd/usr/local/include
LIBS_PATH := ./3rd/usr/local/lib \./3rd/lib/aarch64-linux-gnu \./3rd/usr/lib/aarch64-linux-gnu \./3rd/usr/lib/python3.10LDFLAGS := $(foreach item, $(LIBS_PATH),-L$(item)) # -L./3rd/usr/local/libs
LIBS := -lwiringPi -lpython3.10 -pthread -lexpat -lz -lcrypt
obj/%.o:src/%.cmkdir -p obj$(CC) -o $@ -c $< $(CFLAGS)$(TARGET) :$(OBJ)$(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS) $(LIBS)compile : $(TARGET)clean:rm $(TARGET) obj $(OBJ) -rfdebug:echo $(CC)echo $(SRC)echo $(INC)echo $(OBJ)echo $(TARGET)echo $(CFLAGS)echo $(LDFLAGS)echo $(LIBS).PHONY: clean compile debug

最后在工程里执行

make

就会在obj目录下生成garbage文件, 将该文件拷贝到香橙派里即可执行。

四、Makefile 用于编译 WiringPi 库

在这里插入图片描述
这个 Makefile 主要用于编译 WiringPi 库。下面是对该 Makefile 的注释和一个简单的示例 Makefile 的解释:

# Makefile:
#   wiringPi - Wiring Compatible library for the Raspberry Pi
#
#   Copyright (c) 2012-2015 Gordon Henderson# 版本信息
VERSION=$(shell cat ../VERSION)
DESTDIR?=/usr
PREFIX?=/localLDCONFIG?=ldconfig# 如果没有设置 VERBOSE($V),则默认关闭详细输出
ifneq ($V,1)
Q ?= @
endif# 静态库和动态库的文件名
STATIC=libwiringPi.a
DYNAMIC=libwiringPi.so.$(VERSION)# 调试选项(可以根据需要注释/取消注释)
# DEBUG = -g -O0  # 调试选项
DEBUG = -O2  # 优化选项# 编译器和选项
CC = gcc
INCLUDE = -I.
DEFS = -D_GNU_SOURCE
CFLAGS = $(DEBUG) $(DEFS) -Wformat=2 -Wextra -Winline $(INCLUDE) -pipe -fPIC
LIBS = -lm -lpthread -lrt -lcrypt# 板子类型设置,默认为 orangepioneplus-h6
BOARD = orangepioneplus-h6# 板子类型的额外编译选项
EXTRA_CFLAGS = -DCONFIG_ORANGEPI_LITE2# 源文件列表
SRC = wiringPi.c \wiringSerial.c wiringShift.c \piHiPri.c piThread.c \wiringPiSPI.c wiringPiI2C.c \softPwm.c softTone.c \mcp23008.c mcp23016.c mcp23017.c \mcp23s08.c mcp23s17.c \sr595.c \pcf8574.c pcf8591.c \mcp3002.c mcp3004.c mcp4802.c mcp3422.c \max31855.c max5322.c ads1115.c \sn3218.c \bmp180.c htu21d.c ds18b20.c rht03.c \drcSerial.c drcNet.c \pseudoPins.c \wpiExtensions.c \w25q64.c \oled.c OrangePi.c# 头文件列表
HEADERS = $(shell ls *.h)# 目标文件列表
OBJ = $(SRC:.c=.o)# 主要的目标,生成动态库
.PHONY: all
all: $(DYNAMIC)# 静态库的目标
.PHONY: static
static:@cat noMoreStatic# 生成动态库的规则
$(DYNAMIC): $(OBJ)@echo "[Link (Dynamic)]"$(CC) -shared -Wl,-soname,libwiringPi.so$(WIRINGPI_SONAME_SUFFIX) -o libwiringPi.so.$(VERSION) $(OBJ) $(LIBS)# 编译每个 .c 文件到 .o 文件的规则
.c.o:@echo [Compile] $<$(CC) -c $(EXTRA_CFLAGS) $(CFLAGS) $< -o $@# 清理生成的文件
.PHONY: clean
clean:@echo "[Clean]"rm -f $(OBJ) *~ core tags Makefile.bak libwiringPi.*# 生成 ctags
.PHONY: tags
tags: $(SRC)@echo [ctags]ctags $(SRC)# 安装头文件和动态库到指定位置
.PHONY: install
install: $(DYNAMIC)@echo "[Install Headers]"install -m 0755 -d $(DESTDIR)$(PREFIX)/includeinstall -m 0644 $(HEADERS) $(DESTDIR)$(PREFIX)/include@echo "[Install Dynamic Lib]"install -m 0755 -d $(DESTDIR)$(PREFIX)/libinstall -m 0755 libwiringPi.so.$(VERSION) $(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION)ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION) $(DESTDIR)/lib/libwiringPi.so$(LDCONFIG)# 卸载已安装的头文件和动态库
.PHONY: uninstall
uninstall:@echo "[UnInstall]"cd $(DESTDIR)$(PREFIX)/include/ && rm -f $(HEADERS)cd $(DESTDIR)$(PREFIX)/lib/ && rm -f libwiringPi.*$(LDCONFIG)# 生成依赖关系文件
.PHONY: depend
depend:makedepend -Y $(SRC)

这个 Makefile 主要用于编译 WiringPi 库,提供了编译选项、依赖关系生成、静态库和动态库的编译规则,以及安装和卸载的规则。这个库是用于树莓派 GPIO 操控的工具库。

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

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

相关文章

环境配置:Ubuntu18.04 ROS Melodic安装

前言 不同版本的Ubuntu与ROS存在对应关系。 ROS作为目前最受欢迎的机器人操作系统&#xff0c;其核心代码采用C编写&#xff0c;并以BSD许可发布。ROS起源于2007年&#xff0c;是由斯坦福大学与机器人技术公司Willow Garage合作的Switchyard项目。2012年&#xff0c;ROS团队从…

unity——ScriptableObject相关知识点【学习笔记/不足之处欢迎斧正/个人复习向/侵删】

一、相关简介 1.ScriptableObject是什么&#xff1a;Unity提供的一个数据存储基类 2.ScriptableObject的好处有哪些&#xff1a;文件配置、数据复用、更好的处理数据带来的多态性为 二、ScriptableObject的创建 1.自定义ScriptableOject数据容器 继承ScriptableObject类 在…

Web后端开发:登录认证案例

登录功能 需求分析 在登录界面中&#xff0c;输入用户的用户名以及密码&#xff0c;然后点击 “登录” &#xff0c;服务端判断用户输入的用户名和密码是否都正确。如果正确&#xff0c;则返回成功结果&#xff0c;前端跳转至系统首页面&#xff1b;否则报错&#xff0c;停留在…

【Web】vulhub Shiro-550反序列化漏洞复现学习笔记

目录 Shiro简介 复现流程 工具一把梭 半脚本半手动 原理分析 反序列化入口 常见的key 登录过程 验证过程 利用原理 Shiro简介 Apache Shiro 是一个强大且易于使用的 Java 安全框架&#xff0c;用于身份验证、授权、加密和会话管理等安全功能。Shiro 的设计目标是简单…

2.0 Zookeeper 安装配置

Linux 安装 zookeeper 下载地址为: Apache ZooKeeper。 选择一稳定版本&#xff0c;本教程使用的 release 版本为3.4.14&#xff0c;下载并安装。 打开网址 https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz&#xff0c;看到如下界…

通过平扫CT实现胰腺癌早筛(平扫CT+AI)

Large-scale pancreatic cancer detection via non-contrast CT and deep learning - PubMed (nih.gov) 实验团队&#xff1a;海军军医大学第一附属医院&#xff08;上海长海医院&#xff09;&#xff0c;放射诊断科曹凯主治医生为共同第一作者&#xff0c;邵成伟、陆建平等教…

自然语言学习nlp 六

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

第七届西湖论剑·中国杭州网络安全技能大赛 AI 回声海螺 WP

第七届西湖论剑中国杭州网络安全技能大赛-AI-回声海螺 开题&#xff0c;提示输入密码给FLAG。 这个回声海螺应该是个AI&#xff0c;就是复读机&#xff0c;应该是想办法从中骗出密码。 感觉这题不像是AI&#xff0c;也没用啥模型&#xff0c;应该是WEB。或者是说类似于AI的提示…

150基于matlab的凸轮轮廓的设计计算与绘图计算此结构的最优化参数

基于matlab的凸轮轮廓的设计计算与绘图计算此结构的最优化参数&#xff0c;根据其原理输出推程和回程的最大压力角、最小曲率半径等相关结果。程序已调通&#xff0c;可直接运行。 150 凸轮轮廓的设计 结构的最优化参数 (xiaohongshu.com)

uniapp vue3怎么调用uni-popup组件的this.$refs.message.open() ?

vue2代码 <!-- 提示信息弹窗 --><uni-popup ref"message" type"message"><uni-popup-message :type"msgType" :message"messageText" :duration"2000"></uni-popup-message></uni-popup>typ…

OpenEuler20.03LTS SP2 上安装 OpenGauss3.0.0 单机部署过程(二)

开始安装 OpenGauss 数据库 3.1.7 安装依赖包 (说明:如果可以联网,可以通过网络 yum 安装所需依赖包,既可以跳过本步骤。如果网络无法连通,请把本文档所在目录下的依赖包上传到服务器上,手工安装后,即无需通过网络进行 Yum 安装了): 上传:libaio-0.3.111-5.oe1.x8…

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;这⾥的结构指的是…

《MySQL 简易速速上手小册》第4章:数据安全性管理(2024 最新版)

文章目录 4.1 用户认证和权限控制4.1.1 基础知识4.1.2 重点案例&#xff1a;使用 Python 管理 MySQL 用户权限4.1.3 拓展案例 4.2 防止 SQL 注入和其他安全威胁4.2.1 基础知识4.2.2 重点案例&#xff1a;使用 Python 和 MySQL 进行安全的数据查询4.2.3 拓展案例 4.3 数据加密和…

【Java八股面试系列】JVM-内存区域

目录 Java内存区域 运行时数据区域 线程独享区域 程序计数器 Java 虚拟机栈 StackFlowError&OOM 本地方法栈 线程共享区域 堆 GCR-分代回收算法 字符串常量池 方法区 运行时常量池 HotSpot 虚拟机对象探秘 对象的创建 对象的内存布局 句柄 Java内存区域 运…

Golang与Erlang有什么差异

Golang和Erlang是两种备受关注的编程语言&#xff0c;它们各自具有独特的特点和优势。下面我将简单的探讨一下Golang和Erlang之间的差异&#xff0c;并且分析它们在并发模型、运行环境、函数式编程和领域特性等多个方面的不同之处。 并发模型 Golang使用goroutines和channels…

UE4运用C++和框架开发坦克大战教程笔记(十九)(第58~60集)完结

UE4运用C和框架开发坦克大战教程笔记&#xff08;十九&#xff09;&#xff08;第58~60集&#xff09;完结 58. 弹窗显示与隐藏59. UI 面板销毁60. 框架完成与总结 58. 弹窗显示与隐藏 这节课我们先来补全 TransferMask() 里对于 Overlay 布局类型面板的遮罩转移逻辑&#xff…

获取视频帧图片

在实现了minio文件上传的基础上进行操作 一、编写pom <dependency><groupId>org.jcodec</groupId><artifactId>jcodec</artifactId><version>0.2.5</version> </dependency> <dependency><groupId>org.jcodec<…

【RPA】智能自动化的未来:AI + RPA

伴随着人工智能&#xff08;AI&#xff09;技术的迅猛进步&#xff0c;机器人流程自动化&#xff08;RPA&#xff09;正在经历一场翻天覆地的变革。AI为RPA注入了新的活力&#xff0c;尤其在处理复杂任务和制定决策方面。通过融合自然语言处理&#xff08;NLP&#xff09;、机器…

Flink面试准备

零. 主要内容 一. Flink 提交 1. Flink怎么提交? Local模式 JobManager 和 TaskManager 共用一个 JVM,只需要jdk支持&#xff0c;单节点运行&#xff0c;主要用来调试。 Standlone模式 Standlone 是Flink自带的一个分布式集群&#xff0c;它不依赖其他的资源调度框架、不依赖y…

leetcode——滑动窗口题目汇总

本章总结一下滑动窗口的解题思路&#xff1a; 在字符串中使用双指针 left 和 right 围成的一个左闭右开的区域作为一个窗口。不断将 right 向右滑动&#xff0c;直到窗口中的字符串符合条件。此时将 left 向右滑动&#xff0c;直到窗口中的字符串不符合条件&#xff0c;期间需…