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

【Linux应用】交叉编译环境配置,以及最简单粗暴的环境移植(直接从目标板上复制)

【Linux应用】交叉编译环境配置,以及最简单粗暴的环境移植(直接从目标板上复制)

文章目录

  • 交叉编译器
  • 含有三方库的交叉编译
  • 直接从目标板上复制编译环境
  • glibc库不一致报错
    • 方法1
    • 方法2
  • 附录:
    • ZERO 3烧录
    • ZERO 3串口shell
    • 外设挂载
    • 连接WiFi
    • SSH连接
    • SSH的文件交互
    • 换源

交叉编译器

由于内核架构不同 指令集不同 在PC(x86架构)上编译的代码无法直接在ARM上运行
为了能够在PC上编译ARM架构的可执行程序 那么就需要用到交叉编译器
通常在PC的Linux平台下进行交叉编译
大多数Linux设备都为aarch内核 目前大部分为64位系统 所以就要安装aarch64的交叉编译器

# 查看可以安装的版本
apt-cache search aarch64
# 选择可以安装的版本进行安装
# 此处选择gcc-5-aarch64-linux-gnu以及g++-5-aarch64-linux-gnu进行安装
sudo apt-get install gcc-5-aarch64-linux-gnu 
sudo apt-get install g++-5-aarch64-linux-gnu
# 安装依赖
sudo apt --fix-broken install
# 安装一个没有版本号的gcc和g++
sudo apt-get install gcc-aarch64-linux-gnu
sudo apt-get install g++-aarch64-linux-gnu
# 查看版本
aarch64-linux-gnu-g++ -v
aarch64-linux-gnu-gcc -v

一般来说 直接运行以下即可:

# 安装一个没有版本号的gcc和g++
sudo apt-get install gcc-aarch64-linux-gnu
sudo apt-get install g++-aarch64-linux-gnu
# 查看版本
aarch64-linux-gnu-g++ -v
aarch64-linux-gnu-gcc -v

安装后 可以查看所在位置

~$ whereis aarch64-linux-gnu-gcc
aarch64-linux-gnu-gcc: /usr/bin/aarch64-linux-gnu-gcc /usr/share/man/man1/aarch64-linux-gnu-gcc.1.gz

当使用cmake时 可以直接使用set CMAKE_C_COMPILERCMAKE_CXX_COMPILER 指定编译器
如:

cmake_minimum_required(VERSION 3.10)
set (CMAKE_C_COMPILER "/usr/bin/aarch64-linux-gnu-gcc")
set (CMAKE_CXX_COMPILER "/usr/bin/aarch64-linux-gnu-g++")
project(main) 
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")  
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")  
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
include_directories (${PROJECT_SOURCE_DIR}/include)
aux_source_directory(src SRC_LIST)
add_executable(main ${SRC_LIST}) 

含有三方库的交叉编译

配置了相关交叉编译后 即可通过编译器编译出适合ARM平台运行的程序
但若需要链接一些三方库 则需要另外配置编译环境

譬如链接了opencv库 则就需要将opencv源码下载下来 用交叉编译器编译一遍 然后再编译使用该库的工程

一般需要用到cmake来编译opencv这些三方库

sudo apt install cmake
sudo apt-get install cmake-gui

编译opencv:

cd your opencv dir
unzip opencv-4.6.0.zip
unzip opencv_contrib-4.6.0.zip
cd opencv-4.6.0unzip .cache.zip  #将.cache解压到opencv-4.6.0下mkdir build
mkdir build/aarch64_1
mkdir install
mkdir install/aarch64_1
cd build/aarch64_1

安装依赖包:

#安装一些依赖
sudo apt install cmake git libavcodec-dev libavformat-dev libswscale-dev \
python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev \
libjasper-dev libdc1394-22-dev 
sudo apt install libgtk2.0-dev
sudo apt install pkg-config

设置cmakelist

# 设置目标系统信息
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)# 设置交叉编译工具链路径
set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)# 设置根文件系统路径
set(CMAKE_SYSROOT /path/to/your/sysroot)# 设置查找规则
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

执行cmake:

mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../aarch64-linux-gnu.toolchain.cmake \-D WITH_OPENCL=OFF \-D WITH_CUDA=OFF \-D BUILD_TESTS=OFF \-D BUILD_PERF_TESTS=OFF \-D BUILD_opencv_python2=OFF \-D BUILD_opencv_python3=OFF \../opencv

编译:

make -j$(nproc)
make install

生成相关opencv交叉编译文件后 就可以在工程中导入
但这种方式比较繁琐

直接从目标板上复制编译环境

另外还有一种方式 就是直接复制编译环境
可以先在目标板上装一个编译器 编译一下opencv
然后再把整个环境复制过来
需要从开发板获取的内容:
譬如用到了PCL和opencv库:

/usr/lib/aarch64-linux-gnu/ #下的所有OpenCV/PCL相关.so文件和符号链接
/usr/include/opencv4/ #头文件目录
/usr/lib/cmake/ #下的CMake配置文件
/usr/include/pcl-1.11/ #PCL头文件

在开发板上执行以下命令可以看到这两个库的依赖

dpkg -l | grep -E 'opencv|pcl|boost' > deps_list.txt

在这里插入图片描述
超级多

所以还不如干脆直接整个文件夹都拷过来

也就是usr目录下的include文件夹 和 lib目录下的编译器以及cmake文件夹

在这里插入图片描述
可以将其放到一个目录下 如radxaboot 然后将这个目录放到Linux环境的某个目录 比如 /home/ubuntu/radxaboot
通过cmake检查opencv配置:

在cmake中进行配置:

...# 交叉编译配置必须放在project()之前
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)
set(CMAKE_SYSROOT /home/ubuntu/radxaboot) # 替换为实际的根文件系统路径... # 显式指定库配置路径(根据CMakeCache中的记录)
set(OpenCV_DIR ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/cmake/opencv4)
set(PCL_DIR ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/cmake/pcl)
set(Boost_COMPILER "-gcc10") # 根据实际gcc版本设置... # 查找依赖包(保持原有逻辑)
find_package(OpenCV REQUIRED)
find_package(PCL REQUIRED COMPONENTS common io filters features visualization)
find_package(Threads REQUIRED)
find_package(Boost REQUIRED COMPONENTS filesystem system iostreams date_time regex)...# 调整后的包含目录
include_directories(${OpenCV_INCLUDE_DIRS}${PCL_INCLUDE_DIRS}${CMAKE_SYSROOT}/usr/include/eigen3${CMAKE_SYSROOT}/usr/include/pcl-1.11${CMAKE_CURRENT_SOURCE_DIR}
)...target_link_libraries(PCN${OpenCV_LIBS}${PCL_LIBRARIES}Threads::Threads${Boost_LIBRARIES}# 补充交叉编译需要的特殊库-Wl,--rpath-link=${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu-Wl,--rpath-link=${CMAKE_SYSROOT}/lib/aarch64-linux-gnu)...

然后检测cmake

# 检查OpenCV配置
cmake -DCMAKE_TOOLCHAIN_FILE=../arm64_rootfs.cmake -DOpenCV_DIR=${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/cmake/opencv4 ..

通过后即可编译 但是会报include错误

那么就需要加上:

# 调整后的包含目录
include_directories(${OpenCV_INCLUDE_DIRS}${PCL_INCLUDE_DIRS}${CMAKE_SYSROOT}/usr/include/eigen3${CMAKE_SYSROOT}/usr/include/pcl-1.11${CMAKE_CURRENT_SOURCE_DIR}${CMAKE_SYSROOT}/usr/include/vtk-7.1 # 新增VTK头文件路径
)# 强化后的链接库配置
target_link_libraries(PCN${OpenCV_LIBS}${PCL_LIBRARIES}Threads::Threads${Boost_LIBRARIES}# 补充交叉编译需要的特殊库-Wl,--rpath-link=${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu-Wl,--rpath-link=${CMAKE_SYSROOT}/lib/aarch64-linux-gnuvtkCommonCore-7.1 # 示例VTK库链接vtkFiltersGeneral-7.1 # 根据实际报错添加所需模块
)

另外需要确认以下两点:

移植的根文件系统中存在/usr/include/vtk-7.1目录
确认VTK库文件路径在${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu
如果仍有其他VTK相关报错,建议在CMakeLists.txt开头显式指定VTK路径:

set(VTK_DIR ${CMAKE_SYSROOT}/usr/lib/cmake/vtk-7.1)
find_package(VTK REQUIRED)

再次执行编译就好了 但是要指定我们导入的库目录

cmake -B build -DCMAKE_SYSROOT=/home/ubuntu/radxaboot

编译成功后即可

glibc库不一致报错

如果编译的是静态文件 那么编译成功后就可以直接运行
但如果编译的是动态库
那么就需要考虑编译器版本是否一致 且glibc库是否一致

编译器版本可以在目标板上执行编译器版本命令进行获取
在这里插入图片描述

在编译器目录下执行命令:

sudo ./libc.so.6

可以查看libc版本

在这里插入图片描述
这里就可以获取到版本信息为GCC 10.2.1 + GLIBC 2.31

方法1

方法2

那么在PC的交叉环境中就要安装对应的编译器:

# 添加 Debian 11 (bullseye) 的仓库源(该版本包含所需工具链)
sudo tee /etc/apt/sources.list.d/debian-bullseye.list <<EOF
deb [arch=amd64] http://deb.debian.org/debian bullseye main
deb [arch=amd64] http://deb.debian.org/debian-security bullseye-security main
EOF# 启用多架构支持并安装工具链
sudo dpkg --add-architecture arm64
sudo apt update
sudo apt install -y \gcc-10-aarch64-linux-gnu \g++-10-aarch64-linux-gnu \libc6-arm64-cross=2.31-13+deb11u11 \libc6-dev-arm64-cross=2.31-13+deb11u11# 验证版本
aarch64-linux-gnu-gcc-10 -v  # 应显示 gcc version 10.2.1
aarch64-linux-gnu-readelf -a /usr/aarch64-linux-gnu/lib/libc.so.6 | grep 'GNU C Library'  # 应显示 2.31

但是 多半会安装失败 提示未找到对应版本的库文件

那么就可以手动下载:

# 进入临时目录
mkdir -p ~/temp_cross && cd ~/temp_cross# 从清华镜像站下载指定版本(适用于Debian 11 bullseye)
wget https://mirrors.tuna.tsinghua.edu.cn/debian/pool/main/g/glibc/libc6-arm64-cross_2.31-13+deb11u11_all.deb
wget https://mirrors.tuna.tsinghua.edu.cn/debian/pool/main/g/glibc/libc6-dev-arm64-cross_2.31-13+deb11u11_all.deb# 安装软件包
sudo dpkg -i libc6-arm64-cross_2.31-13+deb11u11_all.deb
sudo dpkg -i libc6-dev-arm64-cross_2.31-13+deb11u11_all.deb# 安装主编译器(此时应该可以正常找到依赖)
sudo apt install -y gcc-10-aarch64-linux-gnu g++-10-aarch64-linux-gnu# 清理安装包
rm libc6-*-cross_*.deb

强制安装配置:

# 修复依赖关系
sudo apt --fix-broken install# 设置候选版本(确保后续更新不会覆盖)
sudo apt-mark hold libc6-arm64-cross libc6-dev-arm64-cross

安装后即可重新编译

附录:

开发板快速上手:镜像烧录、串口shell、外设挂载、WiFi配置、SSH连接、文件交互(RADXA ZERO 3为例)

ZERO 3烧录

ZERO 3有两种 最本质的就是一个带WiFi一个不带WiFi
在这里插入图片描述

ZERO 3作为一个Linux板 其存储支持从sd卡EFI启动

系统安装则直接通过Balena Etcher来进行
可以使用其Windows版本即可
官方文档:
官方文档快速上手描述

镜像下载则也可以使用官方镜像:
Radxa ZERO 3 Debian Build 6

该镜像是最初的镜像 很多依赖都没有
如果开发的话 可以直接下载第三方镜像 或者自己在原有官方镜像上去安装镜像包等等

烧录很简单 直接用工具选择U盘 选择镜像即可

下图为烧录好了的sd卡
在这里插入图片描述
除了系统分区外 就是一个config分区 其挂载根根目录名称即为config

在这里插入图片描述

ZERO 3串口shell

串口与ZERO 3链接如下图:
在这里插入图片描述
链接后 配置串口为

baudrate: 1500000
data bit: 8
stop bit: 1
parity  : none
flow control: none

启动后 用户名和密码都为radxa
在这里插入图片描述

外设挂载

根据df命令查询系统挂载点
在这里插入图片描述
其做好了的U盘外部存储空间为/config
在这里插入图片描述

连接WiFi

使用如下指令链接WiFi:

nmcli device wifi                                           #扫描WiFi
sudo nmcli device wifi connect <ssid> password <passwd>     #连接WiFi

在这里插入图片描述
连上后 使用ip a命令即可查看连接状态和ip
在这里插入图片描述

SSH连接

使用命令sudo systemctl status ssh查看ssh状态在这里插入图片描述
前提是要安装ssh
如果没有安装 则通过shell安装ssh:

sudo apt-get update
sudo apt-get install openssh-server openssh-sftp-server

根据Active判断是否需要重启ssh服务:
重启ssh服务:

sudo systemctl restart ssh

启动后如下:
在这里插入图片描述
Active状态就被设置为了running

开机自启动ssh则使用命令:

sudo systemctl enable --now ssh

在PC上 支持ssh的设备中 使用以下指令链接到板子:

ssh [username]@[IP address] # or ssh [username]@[hostname]

如下图:
在这里插入图片描述

SSH的文件交互

若是在PC上作为主机去访问设备
那么就是在PC的cmd中运行shell

有的终端软件配备了ssh的文件管理传输功能
在这里插入图片描述
连上以后就可以直接搜素到当前目录下的各类文件 以便于实现文件管理
并且可以直接download
在这里插入图片描述

# 复制 Windows 文件到 Linux
scp D:\data\1.txt root@192.168.88.161:/root/data
# 复制 Windows 目录到 Linux(记得加 -r)
scp -r D:\data root@192.168.88.161:/root/data# 复制 Linux 文件到 Windows
scp root@192.168.88.161:/root/data/1.txt D:\data
# 复制 Linux 目录到 Windows(记得加 -r)
scp -r root@192.168.88.161:/root/data D:\data

前提是设备开启了ssh可以被链接
在这里插入图片描述
发过去后便能在板子上看到:
在这里插入图片描述

回传文件夹:
在这里插入图片描述
在这里插入图片描述

如果是Linux设备去连接Windows设备 则需要在Windows里面设置对应的服务 相关教程很多 这里不过多赘述

如果是Linux设备访问Linux设备 则主设备也要指定IP

scp root@192.168.88.161:/root/1.txt root@192.168.88.162:/root# 如果设置了Linux之间的免密登录,可这样写:
scp 192.168.88.161:///root/1.txt 192.168.88.162:///root

换源

Linux系统的源都在/etc/apt/下 一般有两个文件
一个是sources.list 另外一个是sources.list.d目录下的品牌list文件

如树莓派需要备份原本的源:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 
sudo cp /etc/apt/sources.list.d/raspi.list /etc/apt/sources.list.d/raspi.list.bak

而radxa的则是:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 
sudo cp /etc/apt/sources.list.d/radxa.list /etc/apt/sources.list.d/radxa.list.bak

将原本的文件进行编辑:

sudo nano /etc/apt/sources.list

注释掉最初的源 并添加新的源:

deb https://mirrors.tuna.tsinghua.edu.cn/debian bookworm main contrib non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian bookworm-updates main contrib non-free-firmware

如图:
在这里插入图片描述
然后再换子目录下的源

sudo nano /etc/apt/sources.list.d/raspi.list

替换成:

deb https://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ bullseye main

不过很可惜 清华源没有radxa 但是可以换debian的源(/etc/apt/sources.list):

deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free

换源后 执行

sudo apt-get upgrade
sudo apt-get update

相关文章:

【Linux应用】交叉编译环境配置,以及最简单粗暴的环境移植(直接从目标板上复制)

【Linux应用】交叉编译环境配置&#xff0c;以及最简单粗暴的环境移植&#xff08;直接从目标板上复制&#xff09; 文章目录 交叉编译器含有三方库的交叉编译直接从目标板上复制编译环境glibc库不一致报错方法1方法2 附录&#xff1a;ZERO 3烧录ZERO 3串口shell外设挂载连接Wi…...

CentOS 7 磁盘阵列搭建与管理全攻略

CentOS 7 磁盘阵列搭建与管理全攻略 在数据存储需求日益增长的今天&#xff0c;磁盘阵列&#xff08;RAID&#xff09;凭借其卓越的性能、数据安全性和可靠性&#xff0c;成为企业级服务器和数据中心的核心存储解决方案。CentOS 7 作为一款稳定且功能强大的 Linux 操作系统&am…...

CSS3布局方式介绍

CSS3布局方式介绍 CSS3布局&#xff08;Layout&#xff09;系统是现代网页设计中用于构建页面结构和控制元素排列的一组强大工具。CSS3提供了多种布局方式&#xff0c;每种方式都有其适用场景&#xff0c;其中最常用的是Flexbox和CSS Grid。 先看传统上几种布局方式&#xff…...

FPGA设计 时空变换

1、时空变换基本概念 1.1、时空概念简介 时钟速度决定完成任务需要的时间&#xff0c;规模的大小决定完成任务所需要的空间&#xff08;资源&#xff09;&#xff0c;因此速度和规模就是FPGA中时间和空间的体现。 如果要提高FPGA的时钟&#xff0c;每个clk内组合逻辑所能做的事…...

AI心理健康服务平台项目面试实战

AI心理健康服务平台项目面试实战 第一轮提问&#xff1a; 面试官&#xff1a; 请简要介绍一下AI心理健康服务平台的核心技术架构。在AI领域&#xff0c;心理健康服务的机遇主要体现在哪些方面&#xff1f;如何利用NLP技术提升用户与AI的心理健康对话体验&#xff1f; 马架构…...

Eigen稀疏矩阵类 (SparseMatrix)

1. SparseMatrix 核心属性与初始化 模板参数 cpp SparseMatrix<Scalar, Options, StorageIndex> Scalar&#xff1a;数据类型&#xff08;如 double, float&#xff09;。 Options&#xff1a;存储格式&#xff08;默认 ColMajor&#xff0c;可选 RowMajor&#xff0…...

《AI大模型趣味实战》智能Agent和MCP协议的应用实例:搭建一个能阅读DOC文件并实时显示润色改写过程的Python Flask应用

智能Agent和MCP协议的应用实例&#xff1a;搭建一个能阅读DOC文件并实时显示润色改写过程的Python Flask应用 引言 随着人工智能技术的飞速发展&#xff0c;智能Agent与模型上下文协议(MCP)的应用场景越来越广泛。本报告将详细介绍如何基于Python Flask框架构建一个智能应用&…...

uniapp开发03-轮播图组件swiper的简单使用案例

uniapp开发03-轮播图组件swiper的简单使用案例&#xff01;这个仅仅是官方提供的一个轮播图组件啊。实际上我们项目开发的时候&#xff0c;会应用到其他第三方公司的轮播图组件资源&#xff01;效果更强大。兼容性更强。 废话不多说&#xff0c;我们直接上代码。分析代码。 &l…...

DAM-3B,英伟达推出的多模态大语言模型

DAM-3B是什么 DAM-3B&#xff08;Describe Anything 3B&#xff09;是英伟达推出的一款多模态大语言模型&#xff0c;专门用于为图像和视频中的特定区域生成详细描述。用户可以通过点、边界框、涂鸦或掩码等方式来标识目标区域&#xff0c;从而得到精准且符合上下文的文本描述…...

【虚幻C++笔记】碰撞检测

目录 碰撞检测参数详情示例用法 碰撞检测 显示名称中文名称CSphere Trace By Channel按通道进行球体追踪UKismetSystemLibrary::SphereTraceSingleSphere Trace By Profile按描述文件进行球体追踪UKismetSystemLibrary::SphereTraceSingleByProfileSphere Trace For Objects针…...

C++学习:六个月从基础到就业——STL:分配器与设计原理

C学习&#xff1a;六个月从基础到就业——STL&#xff1a;分配器与设计原理 本文是我C学习之旅系列的第三十篇技术文章&#xff0c;也是第二阶段"C进阶特性"的第九篇&#xff0c;主要介绍C STL中的分配器设计原理与实现。查看完整系列目录了解更多内容。 引言 在之前…...

【Android】四大组件之Service

目录 一、什么是Service 二、启停 Service 三、绑定 Service 四、前台服务 五、远程服务扩展 六、服务保活 七、服务启动方法混用 你可以把Service想象成一个“后台默默打工的工人”。它没有UI界面&#xff0c;默默地在后台干活&#xff0c;比如播放音乐、下载文件、处理…...

TRO再添新案 TME再拿下一热门IP,涉及Paddington多个商标

4月2日和4月8日&#xff0c;TME律所代理Paddington & Company Ltd.对热门IP Paddington Bear帕丁顿熊的多类商标发起维权&#xff0c;覆盖文具、家居用品、毛绒玩具、纺织用品、游戏、电影、咖啡、填充玩具等领域。跨境卖家需立即排查店铺内的相关产品&#xff01; 案件基…...

spring-session-data-redis使用

spring-session-data-redis是spring session项目中的一个子模块&#xff0c;&#xff0c;他允许你使用Redis来存储http session&#xff0c;&#xff0c;从而支持多个应用实例之间共享session&#xff0c;&#xff0c;&#xff0c;即分布式session 原理&#xff1a; EnableRed…...

图论---LCA(倍增法)

预处理 O( n logn )&#xff0c;查询O( log n ) #include<bits/stdc.h> using namespace std; typedef pair<int,int> pii; const int N40010,M2*N;//是无向边&#xff0c;边需要见两边int n,m; vector<int> g[N]; //2的幂次范围 0~15 int depth[N],fa[N][1…...

WPF实现类似Microsoft Visual Studio2022界面效果及动态生成界面技术

WPF实现类似VS2022界面效果及动态生成界面技术 一、实现类似VS2022界面效果 1. 主窗口布局与主题 <!-- MainWindow.xaml --> <Window x:Class"VsStyleApp.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x…...

【安全扫描器原理】网络扫描算法

【安全扫描器原理】网络扫描算法 1.非顺序扫描2.高速扫描 & 分布式扫描3.服务扫描 & 指纹扫描 1.非顺序扫描 参考已有的扫描器&#xff0c;会发现几乎所有的扫描器都无一例外地使用增序扫描&#xff0c;即对所扫描的端口自小到大依次扫描&#xff0c;殊不知&#xff0…...

WPF之项目创建

文章目录 引言先决条件创建 WPF 项目步骤理解项目结构XAML 与 C# 代码隐藏第一个 "Hello, WPF!" 示例构建和运行应用程序总结相关学习资源 引言 Windows Presentation Foundation (WPF) 是 Microsoft 用于构建具有丰富用户界面的 Windows 桌面应用程序的现代框架。它…...

Unity中数据储存

在Unity项目开发中,会有很多数据,有需要保存到本地的数据,也有直接保存在缓存中的临时数据,一般为了方便整个项目框架中各个地方能调用需要的数据,因此都会实现一个数据工具或者叫数据管理类,用来管理项目中所有的数据。 首先保存在缓存中的数据,比如用户信息,我们只需…...

第十一天 主菜单/设置界面 过场动画(Timeline) 成就系统(Steam/本地) 多语言支持

前言 对于刚接触Unity的新手开发者来说&#xff0c;构建完整的游戏系统往往充满挑战。本文将手把手教你实现游戏开发中最常见的四大核心系统&#xff1a;主菜单界面、过场动画、成就系统和多语言支持。每个模块都将结合完整代码示例&#xff0c;使用Unity 2022 LTS版本进行演示…...

AI数字人:未来职业的重塑(9/10)

摘要&#xff1a;AI 数字人凭借计算机视觉、自然语言处理与深度学习技术&#xff0c;从虚拟形象进化为智能交互个体&#xff0c;广泛渗透金融、教育、电商等多领域&#xff0c;重构职业生态。其通过降本提效、场景拓展与体验升级机制&#xff0c;替代重复岗位工作&#xff0c;催…...

Android插拔U盘导致黑屏问题排查

问题现象&#xff1a; 车机大屏偶先插拔带音乐的U盘&#xff0c;导致车机系统短暂黑屏的情况。 日志中可以看到vold进程unmount了两次分区&#xff0c;一次是U盘分区&#xff0c;一次是/storage/emulated/0分区&#xff1a; I vold : Start killProcesses: /mnt/media_rw/…...

深入解析Mlivus Cloud中的etcd配置:最佳实践与高级调优指南

作为大禹智库的向量数据库高级研究员,我在《向量数据库指南》一书中详细阐述了向量数据库的核心组件及其优化策略。今天,我将基于30余年的实战经验,深入剖析Mlivus Cloud中etcd这一关键依赖的配置细节与优化方法。对于希望深入掌握Mlivus Cloud的读者,我强烈建议参考《向量…...

分享一个可以批量巡检GET和POST接口的Shell脚本

一、场景痛点与需求分析 在分布式系统架构中&#xff0c;服务接口的可用性和稳定性直接影响业务连续性。当面临以下场景时&#xff0c;需批量巡检GET和POST接口&#xff1a; 上线验证&#xff1a;新版本发布后批量验证核心接口 故障恢复&#xff1a;异常数据修复后的批量重试…...

前端面试宝典---vue原理

vue的Observer简化版 class Observer {constructor(value) {if (!value || typeof value ! object) returnthis.walk(value) // 对对象的所有属性进行遍历并定义响应式}walk (obj) {Object.keys(obj).forEach(key > defineReactive(obj, key, obj[key]))} } // 定义核心方法…...

PyTorch卷积层填充(Padding)与步幅(Stride)详解及代码示例

本文通过具体代码示例讲解PyTorch中卷积操作的填充&#xff08;Padding&#xff09;和步幅&#xff08;Stride&#xff09;对输出形状的影响&#xff0c;帮助读者掌握卷积层的参数配置技巧。 一、填充与步幅基础 填充&#xff08;Padding&#xff09;&#xff1a;在输入数据边缘…...

2025年Redis分片存储性能优化指南

一、分片规则与负载均衡 动态哈希分片‌ 采用CRC16算法计算键哈希值&#xff0c;通过hash_slot CRC16(key) % 16384确定槽位分布&#xff0c;结合Redis Cluster自动管理槽位迁移。 总分片数按需动态调整&#xff0c;例如从16节点扩容至32节点时&#xff0c;触发槽位重分配以…...

【概念】什么是 JWT Token?

—什么是 JWT Token&#xff1f; JWT Token&#xff08;JSON Web Token&#xff09; 就是一张后端发给前端的小票&#xff0c;里面包含用户身份信息&#xff0c;用于做无状态认证&#xff08;Stateless Authentication&#xff09;。 每次前端访问后端接口&#xff0c;都拿着…...

部署大模型需要多少GPU显存?以DeepSeek R1部署为例

引言 部署大型语言模型&#xff08;LLM&#xff09;时究竟需要多少GPU显存&#xff1f;本文将进行一次简单测算。 如何计算 算法1 可以用一个简单的公式来计算显存占用&#xff08;单位GB&#xff09;&#xff1a; 参数说明如下&#xff1a; 符号 含义 M 所需的 GPU 显存…...

用go从零构建写一个RPC(仿gRPC,tRPC)--- 版本1

希望借助手写这个go的中间件项目&#xff0c;能够理解go语言的特性以及用go写中间件的优势之处&#xff0c;同时也是为了更好的使用和优化公司用到的trpc&#xff0c;并且作者之前也使用过grpc并有一定的兴趣&#xff0c;所以打算从0构建一个rpc系统&#xff0c;对于生产环境已…...