Linux:基础IO---动静态库
文章目录
- 1. 动静态库前置知识
- 1.1 动静态库知识回顾
- 1.2 什么是动静态库
- 2. 动静态库
- 2.1 站在库的制作者的角度
- 2.2 站在库的使用者的角度
- 2.3 动态库是怎么被加载的(原理)
- 序:上一篇文章我们从认识到理解,从理解到实现场景,我们知道了什么是软硬链接、数据交换的基本单位—页、操作系统是如何管理内存的还有深入清楚了一个被打开的文件在内核部分是如何被修改文件内容的,而本篇文章将从什么是动静态库,如何连接动静态库,以及动态库在系统内核部分是如何被访问的!!!
1. 动静态库前置知识
1.1 动静态库知识回顾
Linux: .so(动态库).a(静态库)
Windows: .dll(动态库) .lib(静态库)
编译型语言:开发包必然是下载安装对应的头文件和库文件
其中方法的实现就是在库当中
库其实就是把源文件(.c)经过一定翻译,然后打包给你提供一个头文件就行,不用你提供太多源文件
头文件提供你方法的声明,库文件提供你方法的实现+你的代码 == 你的软件(库文件:不做重复工作)
问题一:那么我们的.o文件和库是如何连接的?
动态连接–>动态库(注:动态库不能缺失,否则会导致很多程序无法运行)
静态连接–>静态库
1.2 什么是动静态库
动态库和静态库
动态库因为是共享库,能有效节省资源(磁盘空间、内存空间、网络空间)【优点】,动态库一但缺失,会导致很多程序无法进行【缺点】
静态库,不依赖于库,程序可以独立运行【优点】,体积大,比较消耗资源【缺点】,如果非要静态连接,可以加-static
2. 动静态库
2.1 站在库的制作者的角度
lib.XXX.a—动态链接
lib.XXX.so—静态链接将我们的方法提供给别人使用:将源代码包装成库和.h文件给别人
问题一:一个程序是如何连接静态库的?
makefile如下:
dy-lib=libmethod.so
static-lib=libmymath.a.PHONY:all
all: $(static-lib) $(dy-lib)$(static-lib):mymath.oar -rc $@ $^
mymath.o:mymath.cgcc -c $^$(dy-lib):myprint.o mylog.ogcc -shared -o $@ $^ //其中的-shared选项表示要形成动态库
myprint.o:myprint.cgcc -fPIC -c $^ //-fPIC表示与地址无关码,在后面一章地址程序空间第二讲中会详细说明
mylog.o:mylog.cgcc -fPIC -c $^.PHONY:clean
clean:rm -rf *.a *.o *.so mylib .PHONY:output
output:mkdir -p ./mylib/includemkdir -p ./mylib/libcp mymath.h ./mylib/include cp libmymath.a ./mylib/libcp myprint.h ./mylib/includecp mylog.h ./mylib/include cp libmethod.so ./mylib/lib
我们能直接gcc吗?在程序中包含静态库头文件,然后调用静态库中的函数,能直接gcc,就编译通过,并且执行吗?
如图:
答案显然是不行的!!!当我们gcc时,gcc没办法通过这个头文件找到这个静态库的头文件的位置,所以程序中的头文件无法被识别!!!
这样是不是就是说,我们要在gcc的时候,将静态库的头文件的绝对或相对路径告诉gcc,才能使编译通过?我们可以试试,如果要告诉程序我们的静态库的头文件在哪,可以加个“-I +[头文件的绝对或相对路径]”选项来告诉gcc我们的静态库的头文件在哪!!!
如图:
当我们加了“-I”选项后,我们发现之前找不到头文件的报错消失了!!!但是新的问题又出现了!!!即使,gcc已经找到了静态库的头文件的位置了,但gcc没办法调用静态库中的函数!!!所以我们还要告诉gcc这个静态库的方法调用的库的绝对或相对路径!!!如果要告诉程序我们的静态库在哪,可以加个“-L + [.so库绝对或相对路径]”
如图:
我们发现,即使我们告诉了gcc,我们的头文件的路径和静态库的路径,我们依然没办法将他编译出来,这是为什么?答案就在于gcc即使找到了静态库的目录,gcc也不知道该调用哪一个静态库!!!所以我们的最后一步就是告诉gcc我们要在哪个路径下调用哪个静态库!!!,我们可以使用“-[静态库的名字(去掉前缀lib和后缀.so)]”来告诉gcc我们要调用的静态库的名字!!!
如图:
终于,我们成功调用了我们自己制作的静态库!!!总结:
我们调用静态库时要给出调用头文件的路径和调用静态库的路径和静态库的名字!!!在这里大家可能会有个疑问,那就是为什么我们给出头文件的路径时,为什么不要表明我们要调用哪个头文件,其实在程序中我们已经说明了我们要调用哪一个头文件了,所以就不需要再去表明了!!!
补充:
A. 第三方库,在往后使用的时候,必定是要用gcc -l的
B. 深刻理解errno的本质
C. 如果系统中只提供静态链接,gcc则只能对该库进行静态链接
D. 如果系统中需要链接多个库,则gcc可以链接多个库
2.2 站在库的使用者的角度
问题一:一个程序是如何连接动态库的?
有了之前静态库的链接方式,我们也同样按照那样的顺序去链接试试,结果如下:
第一步:直接gcc
第二步:gcc并加上库头文件的路径
第三步:gcc加上库头文件的路径和动态库的路径和动态库名字
问题来了!为什么我们明明加上了库头文件的路径和动态库的路径和动态库名字,而且编译成功了,但是为什么不能正常运行???当我们编译时,我们告诉了编译器这个动态库的路径和名字,但是当我们编译完后,要执行这个可执行程序时,我们的加载器根本就不知道这个动态库在哪!!!当我们使用命令"ldd+[可执行程序]"时,我们发现这个动态库确实是链接上去了,但是该动态库的指向确实“not found”,这也说明我们的动态库的路径并没有被加载器知道!!!
所以,我们就要让加载器知道我们的动态库在哪!!!
解决加载找不到动态库的方法:
A. 拷贝到系统默认但库路径/usr/lib64/
B. 在系统默认的库路径/usr/lib64/下建立软连接
C. 将自己的库所在的路径,添加到系统的环境变量LD_LIBRARY_PATH中
D. 在目录/etc/ld.so.conf.d中建立自己的动态库路径的配置文件,然后ldcconfig应用即可实际上,我们用的库都是别人的成熟的库,都是采用直接安装到系统的方式!!!(例如:ncurses----基于终端的库)
这里以第四种方法(也是比较方便的方法)来加载动态库为例:
在系统路径下的/etc/ld.so.conf.d目录中,我们可以建立自己的动态库路径配置文件,先创建一个conf文件,然后将动态库的绝对路径放入该文件中,最后再ldcnfig进行应用,我们就可以使用动态库链接的可执行文件了!!!如图:
动态库在运行时,是要被加载的(静态库没有)
常规的动态库被所有的可执行程序(动态链接的),都要使用,动态库----共享库
所以动态库在系统加载之后,会被所有进程共享。
2.3 动态库是怎么被加载的(原理)
当我们执行可执行程序时,当我们要执行动态库中的方法时,动态库会被操作系统加载到物理内存中,然后通过页表映射,映射到进程地址空间当中的共享区内!!!,正文代码就会去自己的进程地址空间的共享区中找到对应的方法,然后调用,将结果返回正文区。当有多个进程访问同一个动态库时,也是通过映射的方法映射同一个物理内存中的动态库,然后在自己的进程地址空间的共享区内调用方法并返回!!!这就是为什么动态库也叫做共享库!!!
结论:建立映射,从此往后,我们执行的任何代码,都是我们进程地址空间中进行执行!!!
事实:系统在运行中,一定会存在多个动态库,所以操作系统要将这些动态库给管理起来—先描述,再组织,所以在操作系统重,所有库的加载情况,操作系统都非常清楚!!!
问题一:如果此时,这个动态库中有一个全局变量errno,但多个进程一起报错,需要返回一个errno值时,岂不是会互相影响吗?
不会互相影响,当一个动态库被多个进程使用时,该动态库是被不同的进程加载到了他们自己的进程地址空间当中的,此时,该动态库的引用计数会加加,当要改变errno的值时,就会引发缺页中断,从而发生写实拷贝!!!此时各个进程的errno值是属于自己进程的,所以各个进程之间不会相互影响!!!
总结:
通过本篇文章我们知道了什么是动静态库以及动静态库的格式,以及如何连接动静态库,动态库和静态库的链接有什么区别,以及动态库在系统内核部分是如何被访问的!!!
相关文章:
Linux:基础IO---动静态库
文章目录 1. 动静态库前置知识1.1 动静态库知识回顾1.2 什么是动静态库 2. 动静态库2.1 站在库的制作者的角度2.2 站在库的使用者的角度2.3 动态库是怎么被加载的(原理) 序:上一篇文章我们从认识到理解,从理解到实现场景ÿ…...
从裸仓库到GitLab全解析
Git服务器搭建与使用指南:从裸仓库到GitLab全解析 前言 在团队协作开发中,版本控制系统是必不可少的工具。虽然GitHub提供了优秀的代码托管服务,但企业级项目往往需要更安全的私有化部署方案。本文将手把手教你两种主流的Git服务器搭建方式…...
OzGIS:地理信息分析与处理软件
大家好,今天为大家介绍的软件是OzGIS:一款地理信息分析与处理软件。下面,我们将从软件的主要功能、支持的系统、软件官网等方面对其进行简单的介绍。 OzGIS官网网址为:https://ozgis.sourceforge.io/。 OzGIS是一款开源软件&#…...
PHP异常处理__Throwable
在 PHP 里,Throwable 是一个极为关键的接口,自 PHP 7 起被引入。它为错误和异常处理构建了一个统一的框架。下面会详细介绍 Throwable 的相关内容。 1. 基本概念 Throwable 是 Exception 和 Error 的父接口。在 PHP 7 之前,异常(…...
PHP异常处理__Exception类
以下是对 PHP 中 Exception 类的详细解释: 一、Exception 类概述 Exception 是 PHP 中所有异常类的基类。它提供了一个通用的异常处理机制,用于处理程序执行过程中可能出现的错误情况。当程序中出现异常时,可以创建 Exception 的实例并将其…...
C++中动态多态类别浅析
非抽象类继承和虚函数 #include <iostream> using namespace std;class Base { public:virtual void func() { // 虚函数,支持动态绑定cout << "Base::func()" << endl;} };class Derived : public Base { public:void func() overrid…...
游戏引擎学习第234天:实现基数排序
回顾并为今天的内容设定背景 我们今天继续进行排序的相关,虽然基本已经完成了,但还是想收尾一下,让整个流程更完整。其实这次排序只是个借口,主要是想顺便聊一聊一些计算机科学的知识点,这些内容在我们项目中平时不会…...
系分架构论文《论高并发场景的架构设计和开发方法》
系统分析师论文范文系列 【摘要】 2022年8月,我司承接了某知名电商平台“秒杀系统架构优化”项目,我作为系统分析师主导了整体架构设计与技术选型工作。该平台在促销活动中面临瞬时流量超过50万QPS的挑战,原有架构存在数据库崩溃、服务响应延…...
最新得物小程序sign签名加密,请求参数解密,响应数据解密逆向分析
点击精选,出现https://app.dewu.com/api/v1/h5/index/fire/index 这个请求 直接搜索sign的话不容易定位 直接搜newAdvForH5就一个,进去再搜sign,打上断点 可以看到t.params就是没有sign的请求参数, 经过Object(a.default)该函数…...
jangow靶机笔记(Vulnhub)
环境准备: 靶机下载地址: https://download.vulnhub.com/jangow/jangow-01-1.0.1.ova kali地址:192.168.144.128 靶机(jangow)地址:192.168.144.180 一.信息收集 1.主机探测 使用arp-scan进行主机探…...
Spring Boot + Caffeine:打造高性能缓存解决方案
1. 引言 1.1 缓存的重要性 缓存是提升系统性能的关键技术之一,通过将频繁访问的数据存储在内存中,减少对数据库或其他外部系统的访问次数,从而降低延迟并提高吞吐量。 缓存的基本概念:缓存是一种临时存储机制,用于快速访问常用数据。缓存在提升系统性能中的作用:减少数…...
C++入门小馆: 深入string类
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的pa…...
命令行基础
学习目标 掌握VRP命令行的基础知识 利用VRP命令行进行基本的配置 VRP命令行的基础知识 一、VRP 命令行基本架构 1. 用户视图(User View) 进入方式:设备启动后默认进入,提示符为 <HUAWEI>。功能&#…...
10-DevOps-Jenkins参数化构建实现多版本发布
在之前的Jenkins配置中,固定写死了程序的版本号,实际情况是随着版本的不断迭代,版本号也是不断变化的,版本号由代码仓库(GitLab)设置。 当前Jenkins配置是固定写的1.0,本节我们要把它改成动态的…...
C++游戏服务器开发之⑦redis的使用
目录 1.当前进度 2.守护进程 3.进程监控 4.玩家姓名添加文件 5.文件删除玩家姓名 6.redis安装 7.redis存取命令 8.redis链表存取 9.redis程序结构 10.hiredisAPI使用 11.基于redis查找玩家姓名 12.MAKEFILE编写 13.游戏业务实现总结 1.当前进度 2.守护进程 3.进程监…...
二进制裁剪命令mips-linux-gnu-strip 命令的使用
-s 或者--strip-all:移除所有符号和调试信息 -g 或者--strip-debug:仅移除调试信息 -d 或者--strip-unneeded:移除不需要的符号 默认不传任何参数 也是移除所有符号和调试 应用:把文件系统所有二进制镜像使用一遍,缩小文件系统大小 79K Apr 19 15:47 fat.ko //使用前 mips-l…...
【Bluedroid】蓝牙存储模块配置管理:启动、读写、加密与保存流程解析
本文围绕蓝牙存储模块展开,主要解析了蓝牙存储模块(StorageModule)的初始化流程,重点围绕配置文件校验、读取、设备类型修复及加密处理展开。通过工厂重置检测、校验和验证、多源配置加载、设备类型推断修正等步骤,确保…...
SpringBoot启动后初始化的几种方式
目录 一、静态代码块 二、构造方法 三、PostConstruct 四、InitializingBean 接口 五、 Bean 注解中的 initMethod 六、 CommandLineRunner 接口 七、ApplicationRunner 接口 八、EventListener事件 九、SmartInitializingSingleton接口 十、ApplicationListener接口…...
asp.net core webapi+efcore
简洁的restfull风格 目前c#提供了多种风格的web编程,因为微软有自己的前端,所以集成了很多内容,不过基于现在编程前后端分离的模式,webapi是合适的。 webapi 目前网络上有很多介绍,不反复说这个了。在建立控制器时&…...
java怎么完善注册,如果邮箱中途更换,能否判断
解析在下面 附赠代码 private static class CodeInfo {String code;long timestamp;CodeInfo(String code, long timestamp) {this.code code;this.timestamp timestamp;}}// 存储验证码(邮箱 -> 验证码信息)(保证线程安全) 以免中途更改邮箱pri…...
实战设计模式之备忘录模式
概述 与解释器模式、迭代器模式一样,备忘录模式也是一种行为设计模式。备忘录模式允许我们保存一个对象的状态,并在稍后恢复到这个状态。该模式非常适合于需要回滚、撤销或历史记录等功能的应用场景。通过使用备忘录模式,开发者可以轻松添加诸…...
数据库表设计
一对一关系 共享主键 两个表的主键是相同的 唯一外键 从表中记录主表的id 一对多关系 从表(多的表)存储主表的id 多对多关系 设计一个中间表(关联表),它有两列分别记录两个主表(A 和 B)…...
Linux 桌面环境 LXQt 2.2 发布
Linux 桌面环境 LXQt 2.2 于 2025 年 4 月 17 日正式发布。这是该轻量级开源 Qt 桌面环境的最新稳定版本,带来了诸多改进,特别是在 Wayland 支持方面。以下是一些主要的更新内容: Wayland 支持增强: 提升了多屏支持,使…...
多人五子棋联机对战平台 测试报告
目录 项目介绍 测试用例设计 部分功能测试示例 自动化测试 测试范围 排除范围 自动化测试目录编辑 执行全部自动化测试用例 性能说明 总结 性能测试 结果分析 测试总结 项目介绍 该项目基于WebSocket实现实时通信,采用SSM框架构建在线五子棋多人联机…...
探索 .bat 文件:自动化任务的利器
在现代计算机操作中,批处理文件(.bat 文件)是一种简单而强大的工具,它可以帮助我们自动化重复性任务,工作效率提高。尽管随着编程语言和脚本工具的发展,.bat 文件的使用频率有所下降,但它依然是…...
240419 leetcode exercises
240419 leetcode exercises jarringslee 文章目录 240419 leetcode exercises[19. 删除链表的倒数第 N 个结点](https://leetcode.cn/problems/remove-nth-node-from-end-of-list/)🔁 经典方法:两次遍历暴力求解🔁 双指针法 :快慢…...
开源Midjourney替代方案:企业级AI绘画+PPT生成系统+AI源码
「AI取代设计师?」开源Midjourney替代方案:企业级AI绘画PPT生成系统 ——零代码私有化部署,5倍速出图100%版权合规 设计师行业的危机与机遇 1. 传统设计流程的致命短板 痛点 人工设计 AI系统 单张海报耗时 3小时(含反复修改…...
学习笔记十七——Rust 支持面向对象编程吗?
🧠 Rust 支持面向对象编程吗? Rust 是一门多范式语言,主要以 安全、并发、函数式、系统级编程为核心目标,但它同时也支持面向对象的一些关键特性,比如: 特性传统 OOP(如 Java/C)Ru…...
图灵奖得主LeCun:DeepSeek开源在产品层是一种竞争,但在基础方法层更像是一种合作;新一代AI将情感化
图片来源:This is World 来源 | Z Potential Z Highlights: 新型的AI系统是以深度学习为基础,能够理解物理世界并且拥有记忆、推理和规划能力的。一旦成功构建这样的系统,它们可能会有类似情感的反应,但这些情感是基…...
Flink框架十大应用场景
Flink框架适合应用的场景 1. 流式数据处理 Flink框架最常用的应用场景是流式数据处理。流式数据处理是指对实时数据进行处理,以便及时地做出决策。例如,一个电商网站需要对用户的行为进行实时分析,以便根据用户的兴趣和行为推荐商品。Flink框架可以帮助电商网站实时地处理数…...
C++镌刻数据密码的树之铭文:二叉搜索树
文章目录 1.二叉搜索树的概念2.二叉搜索树的实现2.1 二叉搜索树的结构2.2 二叉搜索树的节点寻找2.2.1 非递归2.2.2 递归 2.3 二叉搜索树的插入2.3.1 非递归2.3.2 递归 2.4 二叉搜索树的删除2.4.1 非递归2.4.2 递归 2.5 二叉搜索树的拷贝 3.二叉树的应用希望读者们多多三连支持小…...
CAN与CANFD协议说明
在 CAN(Controller Area Network,控制器局域网)协议里,仲裁域波特率和数据域比特率有着不同的含义和作用,下面为你详细介绍并举例说明。 概念解释 仲裁域波特率 含义:仲裁域是 CAN 数据帧中的一部分&…...
【C++ Qt】信号和槽(内配思维导图 图文并茂 通俗易懂)
每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论: 本章是Qt中的第三章,也是我们理解Qt中必备的点 信号槽,它本质由信号和槽两个来实现,其中将细致的讲述如何自定义信号…...
【实战】在 Linux 上使用 Nginx 部署 Python Flask 应用
在 Linux 上使用 Nginx 部署 Python Flask 应用 步骤一:准备 Flask 应用 创建 Flask 应用 确保你有一个可以运行的 Flask 应用。例如,创建一个简单的 app.py 文件: from flask import Flask app Flask(__name__)app.route(/) def hello_wor…...
java ai 图像处理
Java AI 图像处理 图像处理是人工智能(AI)领域中非常重要的一个应用方向。通过使用Java编程语言和相应的库,我们可以实现各种图像处理任务,如图像识别、图像分类、图像分割等。本文将介绍一些常见的图像处理算法,并通过…...
【绘制图像轮廓】图像处理(OpenCV) -part7
15 绘制图像轮廓 15.1 什么是轮廓 轮廓是一系列相连的点组成的曲线,代表了物体的基本外形。相对于边缘,轮廓是连续的,边缘不一定连续,如下图所示。轮廓是一个闭合的、封闭的形状。 轮廓的作用: 形状分析 目标识别 …...
Mesh模型孔洞修补算法总汇
关于Mesh 孔洞修补算法(Hole Filling in Meshes),这是计算几何和图形学中的一个重要话题,常用于重建、3D 扫描、建模等领域。下面我会系统总结主流和经典的孔洞修补方法,并按技术路线分类说明每种的原理、优缺点&#…...
ARINC818协议(六)
上图中,红色虚线上面为我们常用的simple mode简单模式,下面和上面的结合在一起,就形成了extended mode扩展模式。 ARINC818协议 container header容器头 ancillary data辅助数据 视频流 ADVB帧映射 FHCP传输协议 R_CTRL:路由控制routing ctr…...
RTMP握手流程
RTMP(Real-Time Messaging Protocol) 不支持除H.264/AAC之外的标准。 使用TCP,当到达网络拥塞、宽带上限时,传输质量受到影响。 URL格式: rtmp://host:port/app(名称)/stream(流IDÿ…...
【解决】torch引入过程中的ImportError: __nvJitLinkAddData_12_1, version libnvJitLink.so.12
大纲 本文记录在环境配置好后,在 import torch 过程中报了 异常 ImportError: /home/Coding/Envs/envs/only_test/lib/python3.10/site-packages/torch/lib/../../nvidia/cusparse/lib/libcusparse.so.12: undefined symbol: __nvJitLinkAddData_12_1, version lib…...
面试招聘:新能源汽车研发测试人员需求内部研讨会纪要(2025年4月19日草稿流出)
标题:XX汽车技术中心技术管理岗闭门会议纪要完整版:双非招聘策略、面试话术与风控方案(附待定事项) 【内部密级文件】 时间:2025年4月15日 14:00-17:30 地点:某主机厂研发中心会议室(305&#…...
从零开始学习 Lucene.Net:.NET Core 中的全文搜索与索引管理
Lucene.Net 是一个开源的全文搜索引擎库,它是 Apache Lucene 项目的 .NET 移植版本。Lucene.Net 提供了强大的搜索功能,广泛应用于文档搜索、日志分析、数据检索等场景。随着大数据的爆发,开发者越来越依赖高效的搜索引擎来实现复杂的搜索需求…...
opencv--图像处理
图像处理技术 图像处理技术是利用计算机对图像进行计算,分析和处理的技术,包括数字图像处理和计算机视觉两大领域。 对图像的处理包括滤波,缩放,分割,识别(两种信息对比)等。 链接 数字图像处理 1. 数字图像处理(Digital Image Processing) 数字图像处理主要关注图…...
JCST 2025年 区块链论文 录用汇总
Conference:Journal of Computer Science and Technology (JCST) CCF level:CCF B Categories:交叉/综合/新兴 Year:2025(截止4.19) JCST 2024年 区块链论文 录用汇总 1 Title: An Understandable Cro…...
股指期货跨期套利是如何赚取价差利润的?
股指期货跨期套利,简单来说,就是在同一交易所内,针对同一股指期货品种的不同交割月份合约进行的套利交易。投资者会同时买入某一月份的股指期货合约,并卖出另一月份的股指期货合约,待未来某个时间点,再将这…...
【java实现+4种变体完整例子】排序算法中【冒泡排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格
以下是冒泡排序的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格: 一、冒泡排序基础实现 原理 通过重复遍历数组,比较相邻元素并交换逆序对,逐步将最大值“冒泡”到数组末尾。 代码示例 pu…...
毕业论文超清pdf带标签导出
Word直接导出的pdf不够清晰,使用打印导出的pdf又不带书签以及目录跳转功能这一问题,查阅网上资料使用Adobe DC似乎能够解决但是下载安装比较麻烦,于是写了python程序解决该问题。 解决思路: 使用python脚本对两个pdf文件进行合并…...
STM32单片机入门学习——第43节: [12-3] 读写备份寄存器实时时钟
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.19 STM32开发板学习——第43节: [12-3] 读写备份寄存器&实时时钟 前言开发板说明…...
筛选法(埃氏筛法)C++
判断N个数是否质数 输入N个整数M,判断它们是否为质数。如果是输出“YES”,否则输出“NO”。(1<n<10000) 输入格式 第一行为N,第2~n1行每行为一个正整数M。(1<M<1000000)…...
PointCore——利用局部全局特征的高效无监督点云异常检测器论文与算法解读
概述 三维点云异常检测旨在从训练集中检测出异常数据点,是工业检测、自动驾驶等众多应用的基础。然而,现有的点云异常检测方法通常采用多个特征存储库来充分保留局部和全局特征表示,这带来了高昂的计算成本以及特征之间的不匹配问题。为解决…...