GCC之编译(8)AR打包命令
GCC之(8)AR二进制打包命令
Author: Once Day Date: 2025年1月23日
一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…
漫漫长路,有人对你微笑过嘛…
全系列文章请查看专栏: Linux实践记录_Once-Day的博客-CSDN博客
参考文章:
- ar(1) - Linux manual page
- 【Linux】ar命令:用于创建、修改和提取静态库(archive)-CSDN博客
- Linux命令学习手册-ar - 知乎
- Linux ar命令介绍 和常用示例 - Link_Z - 博客园
文章目录
- GCC之(8)AR二进制打包命令
- 1. AR概述
- 1.1 介绍
- 1.2 档案(archive)
- 2. 命令参数介绍
- 2.1 ar操作指令
- 2.2 ar通用命令修饰符
- 2.3 plugin选项
- 3. 使用技巧
- 3.1 makefile打包二进制文件
- 3.2 重新组合二进制文件
1. AR概述
1.1 介绍
GCC中的AR命令全称是Archive,是一个用于创建、修改和提取档案(archive)文件的工具。档案文件通常用于将多个目标文件打包成一个文件,以便于管理和分发。AR命令在Linux/Unix系统的开发和构建过程中经常使用。
以下是AR命令的一些常见用法:
(1)创建档案文件:
ar rc libmylib.a file1.o file2.o file3.o
上述命令会创建一个名为libmylib.a
的档案文件,并将file1.o
、file2.o
和file3.o
三个目标文件打包进去。
(2)查看档案文件内容:
ar t libmylib.a
该命令会列出libmylib.a
档案文件中包含的所有目标文件。
(3)向档案文件中添加目标文件:
ar r libmylib.a file4.o
该命令会将file4.o
目标文件添加到libmylib.a
档案文件中。如果档案文件不存在,则会创建一个新的档案文件。
(4)从档案文件中提取目标文件:
ar x libmylib.a file2.o
该命令会从libmylib.a
档案文件中提取出file2.o
目标文件。
(5)删除档案文件中的目标文件:
ar d libmylib.a file3.o
该命令会从libmylib.a
档案文件中删除file3.o
目标文件。
AR命令还有其他一些选项和用法,可以通过man ar
命令查看完整的文档。
在使用GCC进行编译和链接时,AR命令通常用于创建静态库。静态库是一种将目标文件打包成单个文件的方式,在链接阶段会被链接到最终的可执行文件中。通过使用AR命令创建静态库,可以方便地管理和重用代码,提高开发效率。
1.2 档案(archive)
档案(archive)是一个包含多个文件的单个文件,其结构使得可以检索原始的单个文件(称为档案的成员)。
ar可以保留原始文件的内容、模式(权限)、时间戳、所有者和组,并在提取时恢复。GNU ar支持成员名称任意长度,但可能会根据系统配置对成员名称长度施加限制,以兼容其他工具维护的档案格式。通常限制为15个字符(与a.out相关的格式)或16个字符(与coff相关的格式)。
ar被视为二进制实用程序,因为这种档案通常用作包含常用子程序的库。由于库通常依赖于其他库,ar还可以在指定--record-libdeps
选项时记录库的依赖关系。
当指定修饰符s时,ar会为档案中的可重定位目标模块创建符号索引。创建后,每当ar对档案内容进行更改时(除了q更新操作),都会更新该索引。具有此索引的档案可加速链接到库的过程,并允许库中的例程相互调用,而无需考虑它们在档案中的位置。
可以使用nm -s
或nm --print-armap
列出该索引表。如果档案缺少该表,可以使用另一种形式的ar(称为ranlib)仅添加该表。
GNU ar可以选择创建薄档案(thin archive),其中包含符号索引和对档案成员文件原始副本的引用。这对于在本地构建树中构建库很有用,在那里可重定位对象预期保持可用,而复制每个对象的内容只会浪费时间和空间。
档案可以是薄的,也可以是普通的,但不能同时是两者。一旦创建了档案,如果不先删除它并在其位置创建新档案,就无法更改其格式。
薄档案也是扁平的,因此将一个薄档案添加到另一个薄档案中不会嵌套它,而普通档案则会发生这种情况。相反,第一个档案的元素被单独添加到第二个档案中。
档案元素的路径相对于档案本身进行存储。
可重定位目标模块是指包含机器码、数据和重定位信息的目标文件,通常由编译器或汇编器生成,可以在链接阶段与其他模块合并以创建可执行文件或库。
符号是指在程序中使用的变量、函数或标签的名称。符号索引可以加快链接速度,因为链接器可以快速定位所需的符号,而无需搜索整个档案。
2. 命令参数介绍
AR的命令帮助信息如下:
ubuntu->~:$ ar --help
Usage: ar [emulation options] [-]{dmpqrstx}[abcDfilMNoOPsSTuvV] [--plugin <name>] [member-name] [count] archive-file file...ar -M [<mri-script]commands:d - delete file(s) from the archivem[ab] - move file(s) in the archivep - print file(s) found in the archiveq[f] - quick append file(s) to the archiver[ab][f][u] - replace existing or insert new file(s) into the archives - act as ranlibt[O][v] - display contents of the archivex[o] - extract file(s) from the archivecommand specific modifiers:[a] - put file(s) after [member-name][b] - put file(s) before [member-name] (same as [i])[D] - use zero for timestamps and uids/gids (default)[U] - use actual timestamps and uids/gids[N] - use instance [count] of name[f] - truncate inserted file names[P] - use full path names when matching[o] - preserve original dates[O] - display offsets of files in the archive[u] - only replace files that are newer than current archive contentsgeneric modifiers:[c] - do not warn if the library had to be created[s] - create an archive index (cf. ranlib)[l <text> ] - specify the dependencies of this library[S] - do not build a symbol table[T] - deprecated, use --thin instead[v] - be verbose[V] - display the version number@<file> - read options from <file>--target=BFDNAME - specify the target object format as BFDNAME--output=DIRNAME - specify the output directory for extraction operations--record-libdeps=<text> - specify the dependencies of this library--thin - make a thin archiveoptional:--plugin <p> - load the specified plugin
2.1 ar操作指令
下面是AR的常用操作指令说明:
(1)删除(d),从归档文件中删除指定的文件。
ar d libtest.a file1.o file2.o
该命令将从libtest.a归档文件中删除file1.o和file2.o文件。
(2)移动(m[ab]),在归档文件中移动文件的位置。
ar mab libtest.a file1.o file2.o
该命令将file1.o和file2.o文件移动到归档文件的末尾(b选项)或者开头(a选项)。
(3)打印§,打印归档文件中指定文件的内容。
ar p libtest.a file1.o
该命令将显示libtest.a归档文件中file1.o文件的内容。
(4)快速追加(q[f]),将文件快速追加到归档文件的末尾。
ar q libtest.a file3.o file4.o
该命令将file3.o和file4.o文件追加到libtest.a归档文件的末尾。如果使用f选项,则即使归档文件不存在也会创建它。
(5)替换或插入(r[ab][f][u]
),替换归档文件中已有的文件,或插入新文件。
ar r libtest.a file1.o file5.o
该命令将用file5.o替换libtest.a归档文件中的file1.o,如果file5.o不存在,则将其插入到归档文件中。选项a和b分别表示将文件插入到归档的开头或末尾,f选项表示即使归档文件不存在也会创建它,u选项表示只有当文件比归档中的同名文件更新时才替换。
(6)符号表(s),类似于ranlib命令,用于创建或更新归档文件的符号表。
ar s libtest.a
该命令将创建或更新libtest.a归档文件的符号表,加速对归档文件中符号的访问。
(7)内容列表(t[O][v]
),显示归档文件的内容列表。
ar tv libtest.a
该命令将显示libtest.a归档文件中的文件列表。v选项提供详细输出,O选项按照归档文件中的顺序显示文件列表。
(8)提取(x[o]
),从归档文件中提取指定的文件。
ar x libtest.a file1.o file2.o
该命令将从libtest.a归档文件中提取file1.o和file2.o文件。o选项表示提取文件时保留原始的日期。
2.2 ar通用命令修饰符
下面是AR的通用命令修饰符介绍:
(1)不警告([c]
),在创建归档文件时,如果归档文件不存在,AR不会显示警告信息。这在脚本或自动化流程中很有用,可以避免不必要的警告输出。
ar cr libtest.a file1.o file2.o
(2)符号表索引([s]
),在创建归档文件时,AR会同时创建归档文件的符号表索引,类似于ranlib命令的功能。这样可以加速对归档文件中符号的访问,特别是在大型项目中使用归档文件作为库时非常有用。
ar rs libtest.a file1.o file2.o
(3)依赖关系([l]
),指定当前库文件的依赖关系。这个选项可以在归档文件中记录其所依赖的其他库文件,方便管理复杂的库依赖关系。
ar rl "libdep1.a libdep2.a" libtest.a file1.o file2.o
(4)不生成符号表([S]
),在创建归档文件时,AR不会生成符号表。这可以减小归档文件的大小,但会影响对归档文件中符号的访问效率。
ar rS libtest.a file1.o file2.o
(5)详细输出([v]
),在执行操作时,AR会显示详细的信息,包括正在处理的文件名、操作结果等。这对于调试和理解AR的行为非常有帮助。
ar rvx libtest.a file1.o file2.o
(6)版本号([V]),显示AR的版本号。这个选项可以用于检查当前系统中AR的版本,以确保兼容性。
ar V
(7)读取选项文件(@
),从指定的文件中读取AR命令选项。这个功能可以将一组常用的AR选项存储在文件中,然后通过@
选项来引用,从而简化AR命令的编写。
ar @options.txt
(8)目标文件格式(--target=BFDNAME
),指定目标对象文件格式为BFDNAME。这个选项可以让AR适应不同的目标平台和文件格式,提高其灵活性和可移植性。
ar --target=elf64-x86-64 r libtest.a file1.o file2.o
(9)提取输出目录(--output=DIRNAME
),指定提取操作的输出目录。这个选项可以将提取的文件放置在指定的目录中,而不是当前工作目录,方便管理提取出的文件。
ar --output=extracted_files x libtest.a
(10)记录依赖关系(--record-libdeps=
),指定当前库文件的依赖关系,与[l]
选项类似。这个选项提供了另一种记录库依赖关系的方式,可以根据个人喜好选择使用。
ar --record-libdeps="libdep1.a libdep2.a" r libtest.a file1.o file2.o
(11)瘦归档文件(–thin),创建瘦归档文件,即只存储文件的路径而不存储文件内容。这种归档文件可以大大减小归档文件的大小,特别适用于存储大量小文件的场景。但是,使用瘦归档文件时,需要确保原始文件在提取时可用。
ar --thin r libtest.a file1.o file2.o
2.3 plugin选项
AR的--plugin
选项允许AR加载额外的插件,以支持更多的文件格式,包括包含链接时优化(Link-Time Optimization, LTO)信息的目标文件。这个功能可以显著扩展AR的应用范围和灵活性,特别是在使用LTO等高级编译优化技术时。
使用--plugin
选项的基本语法如下:
ar --plugin name [other options] [member...]
其中,name是要加载的插件名称。例如,要加载名为liblto_plugin.so
的插件,可以使用以下命令:
ar --plugin liblto_plugin.so r libtest.a file1.o file2.o
需要注意的是,--plugin
选项只在工具链启用了插件支持时可用。如果在构建工具链时没有启用插件支持,则无法使用该选项。
如果没有通过--plugin
选项指定要加载的插件,但工具链启用了插件支持,那么AR会自动搜索${libdir}/bfd-plugins
目录下的插件文件。AR会按照字母顺序遍历该目录下的文件,并使用第一个声明支持当前目标文件的插件。这种机制可以简化插件的管理和使用,无需每次都显式指定插件名称。
例如,假设${libdir}/bfd-plugins
目录下有以下插件文件:
liblto_plugin.so.0.0.0
my_custom_plugin.so
other_plugin.so
当使用AR操作包含LTO信息的目标文件时,如果没有通过--plugin
选项指定插件名称,AR会自动选择liblto_plugin.so.0.0.0
插件,因为它在字母顺序上优先于其他插件。
需要特别注意的是,AR的--plugin
选项使用的插件搜索目录与ld的-plugin
选项不同。为了让AR使用ld的插件,需要将插件文件复制到${libdir}/bfd-plugins
目录下。对于基于GCC的编译,ld的插件文件通常名为liblto_plugin.so.0.0.0
,而基于Clang的编译则使用LLVMgold.so
。GCC插件通常向后兼容早期版本,因此只需复制最新版本的插件文件即可。
3. 使用技巧
3.1 makefile打包二进制文件
在Makefile编译流程中,AR工具通常用于创建和管理静态库文件(.a
文件)。静态库是一组目标文件(.o
文件)的集合,可以在链接阶段被其他目标文件或可执行文件引用。通过将常用的函数、类等代码编译为静态库,可以提高代码的重用性、模块化和可维护性。
在Makefile中,AR工具的作用主要体现在以下两个方面:
- 创建静态库:将一组
.o
文件打包成一个.a
静态库文件。 - 更新静态库:向已有的
.a
静态库文件中添加、删除或替换.o
文件。
以下是在Makefile中使用AR工具的典型实现形式:
# 定义静态库的名称
LIBRARY = libmylib.a# 定义静态库所包含的目标文件
OBJECTS = file1.o file2.o file3.o# 定义编译器和编译选项
CC = gcc
CFLAGS = -Wall -c# 定义AR工具和操作选项
AR = ar
ARFLAGS = rcs# 默认的目标:创建静态库
all: $(LIBRARY)# 创建静态库的规则
$(LIBRARY): $(OBJECTS)$(AR) $(ARFLAGS) $@ $^# 编译目标文件的规则
%.o: %.c$(CC) $(CFLAGS) $< -o $@# 清理生成的文件
clean:rm -f $(OBJECTS) $(LIBRARY)
在上面的Makefile示例中:
LIBRARY
变量定义了要创建的静态库的名称,这里是libmylib.a
。OBJECTS
变量定义了静态库所包含的目标文件,这里是file1.o
、file2.o
和file3.o
。CC
和CFLAGS
变量定义了编译器和编译选项,用于编译源代码文件生成目标文件。AR
和ARFLAGS
变量定义了AR工具和操作选项。ARFLAGS
中的r
表示替换或添加目标文件,c
表示在必要时创建静态库,s
表示创建目标文件索引以加快访问速度。all
目标是默认目标,依赖于$(LIBRARY)
,表示创建静态库。$(LIBRARY)
目标的规则描述了如何从目标文件$(OBJECTS)
创建静态库。$@
表示目标名称,即$(LIBRARY)
,$^
表示所有的依赖文件,即$(OBJECTS)
。%.o: %.c
是一个隐含规则,描述了如何从.c
源文件编译生成.o
目标文件。clean
目标用于清理生成的中间文件和静态库文件。
当在命令行中执行make
命令时,Makefile中的规则将被依次执行,最终生成静态库文件libmylib.a
。
3.2 重新组合二进制文件
在某些情况下,我们可能需要从现有的静态库中提取出特定的目标文件(.o文件),并将其与其他源代码文件一起重新编译,以生成新的二进制文件。这种技术可以用于重用现有的代码库、修复特定模块中的错误、或者创建定制的库和可执行文件。以下是使用AR提取静态库中的.o文件,并与其他源代码混合编译新的二进制文件的详细步骤:
(1)使用AR的x操作提取静态库中的.o文件:
ar x libtest.a file1.o file2.o
该命令将从libtest.a静态库中提取出file1.o
和file2.o
两个目标文件。执行后,当前目录下会出现file1.o
和file2.o
文件。
(2)准备其他需要参与编译的源代码文件,例如file3.c
和file4.c
。
(3)使用编译器(如gcc)将提取出的.o文件和其他源代码文件一起编译,生成新的二进制文件:
gcc -o newbinary file1.o file2.o file3.c file4.c
该命令将file1.o
、file2.o
、file3.c
和file4.c
一起编译,生成名为newbinary的新二进制文件。
Once Day
也信美人终作土,不堪幽梦太匆匆......
如果这篇文章为您带来了帮助或启发,不妨点个赞👍和关注,再加上一个小小的收藏⭐!
(。◕‿◕。)感谢您的阅读与支持~~~
相关文章:

GCC之编译(8)AR打包命令
GCC之(8)AR二进制打包命令 Author: Once Day Date: 2025年1月23日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章请查看专栏: Linux实践记录_Once-Day的博客-C…...

RocketMQ原理—4.消息读写的性能优化
大纲 1.Producer基于队列的消息分发机制 2.Producer基于Hash的有序消息分发 3.Broker如何实现高并发消息数据写入 4.RocketMQ读写队列的运作原理分析 5.Consumer拉取消息的流程原理分析 6.ConsumeQueue的随机位置读取需求分析 7.ConsumeQueue的物理存储结构设计 8.Cons…...

(Halcon)轮廓等分切割(项目分析)
目标:获取绿色圆所在位置(可用于点焊/点胶引导) 实现思路 一,相机标定板标定(如果实战用于点焊/点胶引导需要做图像畸变校正以减小误差) 相机标定 如何做一个C#仿Halcon Calibration插件-CSDN博客 二&…...

NIO 和 Netty 在 Spring Boot 中的集成与使用
Netty到底是个啥,有啥子作用 1. Netty 的本质:对 NIO 的封装 NIO 的原生问题: Java 的 NIO 提供了非阻塞 I/O 和多路复用机制,但其使用较为复杂(如 Selector、Channel、Buffer 的配置和管理)。开发者需要自…...

【更正版】梯级水光互补系统最大化可消纳电量期望短期优化调度模型
目录 1 主要内容 目标函数: 约束条件: 线性化处理: 流程示意: 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《梯级水光互补系统最大化可消纳电量期望短期优化调度模型》,构建了以最大化整体可…...

基于AnolisOS 8.6安装GmSSL 3.1.1及easy_gmssl库测试国密算法
测试环境 Virtual Box,AnolisOS-8.6-x86_64-minimal.iso,4 vCPU, 8G RAM, 60 vDisk。最小化安装。需联网。 系统环境 关闭防火墙 systemctl stop firewalld systemctl disable firewalld systemctl status firewalld selinux关闭 cat /etc/selinux/co…...

vue3 实际应用 将一个日期使用 moment.js 实现星期 今天 明天 ...
数据源 ["2025-01-23","2025-01-24","2025-01-25","2025-01-28","2025-01-26","2025-01-27" ] 后端给返回了一个这样的数据 日期数据 实际应用中实现的是这样的显示效果 日期需要这样显示的tabs 栏 我们需要…...

LLM幻觉(Hallucination)缓解技术综述与展望
LLMs 中的幻觉问题(LLM 幻觉:现象剖析、影响与应对策略)对其可靠性与实用性构成了严重威胁。幻觉现象表现为模型生成的内容与事实严重不符,在医疗、金融、法律等对准确性要求极高的关键领域,可能引发误导性后果&#x…...

Unity入门2 背景叠层 瓦片规则
切割场景 瓦片调色盘 放在Assets里面新建瓦片地图,palettes tile 瓦片 palettes调色板 上下窗口是分开的 拖进这个格子窗 瓦片太碎,要封装 装好之后,只是把瓦片放上去了,但是还没有画布,显示是这样的 no valid target 新建“…...

docker-制作镜像gcc添加jdk运行java程序
最近的项目需要使用java调用c的链接库,.OS文件,一开始准备在jdk的镜像下去安装c的环境,不过安装的内容很多,比较复杂也容易缺很多的包,经过实验,我们决定使用gcc的镜像安装jdk来正确的运行java程序。 基础镜…...

HashTable, HashMap, ConcurrentHashMap 之间的区别
一、HashTable 只是将关键方法加上了锁(synchronized关键字)。 缺点:1.如果多线程访问同一个HashTable就回直接造成锁冲突。 2.HashTable的size属性也是通过 synchronized来控制同步的,效率比较低。 3.在扩容时会涉及大量的拷贝…...

vue2和vue3组件之间的通信方式差异
Vue2 vs Vue3 组件通信方法对比 1. 父子组件通信 1.1 Props 传递 Vue2 <!-- 父组件 --> <template><child-component :message"message"></child-component> </template><script> export default {data() {return {message:…...

报错:MC1000未知的生成错误Invalid number of sections declared in PE header
报错:MC1000未知的生成错误Invalid number of sections declared in PE header 报错问题: MC1000未知的生成错误Invalid number of sections declared in PE header 开发环境:vs2022,编译C#工程时报错, 解决办法:重新…...

FPGA实现任意角度视频旋转(二)视频90度/270度无裁剪旋转
本文主要介绍如何基于FPGA实现视频的90度/270度无裁剪旋转,旋转效果示意图如下: 为了实时对比旋转效果,采用分屏显示进行处理,左边代表旋转前的视频在屏幕中的位置,右边代表旋转后的视频在屏幕中的位置。 分屏显示的…...

Linux(Centos 7.6)命令详解:wc
1.命令作用 打印文件的行数、单词数、字节数,如果指定了多个文件,还会打印以上三种数据的总和(Print newline, word, and byte counts for each FILE, and a total line if more than one FILE is specified) 2.命令语法 Usage: wc [OPTION]... [FIL…...

centos7执行yum操作时报错Could not retrieve mirrorlist http://mirrorlist.centos.org解决
**原因:**CentOS 7 的官方仓库在 2024 年 6 月 30 日之后已经停止维护,不需要再去检查什么网络、DNS等乱七八糟的,因为这玩意都停止维护了,就算其他配置正常也照样不通。 **解决:**将CentOS-Base.repo文件替换成下面的…...

C语言程序设计:算法程序的灵魂
文章目录 C语言程序设计:算法程序的灵魂算法数据结构程序数据结构算法数值运算算法非数值运算算法 简单的算法举例【例2.1】求12345【例2.2】有50个学生,要求输出成绩在80分以上的学生的学号和成绩 简单的算法举例【例2.3】判定2000—2500年中的每一年是…...

openlayer getLayerById 根据id获取layer图层
背景: 在项目中使用getLayerById获取图层,这个getLayerById()方法不是openlayer官方文档自带的,而是自己封装的一个方法,这个封装的方法的思路是:遍历所有的layer,根据唯一标识【可能是id,也可能…...

在 vscode + cmake + GNU 工具链的基础上配置 JLINK
安装 JLINK JLINK 官网链接 下载安装后找到安装路径下的可执行文件 将此路径添加到环境变量的 Path 中。 创建 JFlash 项目 打开 JFlash,选择新建项目 选择单片机型号 在弹出的窗口中搜索单片机 其他参数根据实际情况填写 新建完成: 接下来设置…...

react antd点击table单元格文字下载指定的excel路径
在使用 Ant Design (antd) 的 Table 组件时,如果想点击表格单元格中的文字来触发下载指定路径的 Excel 文件,可以通过以下步骤实现: 1. 确保有一个可供下载的 Excel 文件:需要有一个服务器端点或者一个可以直接访问的 URL…...

01-AD工具使用
01-AD工具使用 AD工程创建1.创建Project工程2.创建原理图&&PCB文件3.保存活动和整个文档 创建新元件的能力导入已有素材:元件库的能力创建各种类型元器件的方法元器件TYPE-C 3.1 母头 16P插头AMS1117-3.3电源芯片STM32F103的IC芯片C2-104电容R4-1K电阻D1发光二极管 原理…...

centos7 配置国内镜像源安装 docker
使用国内镜像源:由于 Docker 的官方源在国内访问可能不稳定,你可以使用国内的镜像源,如阿里云的镜像源。手动创建 /etc/yum.repos.d/docker-ce.repo 文件,并添加以下内容: [docker-ce-stable] nameDocker CE Stable -…...

Java设计模式 十八 状态模式 (State Pattern)
状态模式 (State Pattern) 状态模式是一种行为型设计模式,它允许对象在其内部状态改变时改变其行为。状态模式让一个对象在其状态改变时,其行为也随之改变,看起来就像是改变了对象的类。通过将状态的变化封装到不同的状态对象中,…...

PyTorch张量操作reshape view permute transpose
1. reshape() 和 view() view和reshape都用于改变张量的shape view是reshape的一个特例,view要求张量在内存中是连续的,否则会抛出错误,view只能用于contiguous的张量 reshape会自动处理contiguous的情况,如果张量是contiguous…...

RabbitMQ5-死信队列
目录 死信的概念 死信的来源 死信实战 死信之TTl 死信之最大长度 死信之消息被拒 死信的概念 死信,顾名思义就是无法被消费的消息,一般来说,producer 将消息投递到 broker 或直接到queue 里了,consumer 从 queue 取出消息进…...

macOS使用LLVM官方发布的tar.xz来安装Clang编译器
之前笔者写过一篇博文ubuntu使用LLVM官方发布的tar.xz来安装Clang编译器介绍了Ubuntu下使用官方发布的tar.xz包来安装Clang编译。官方发布的版本中也有MacOS版本的tar.xz,那MacOS应该也是可以安装的。 笔者2015款MBP笔记本,CPU是intel的,出厂…...

【算法学习】归并排序算法思想的应用—求逆序对数量
Hey,大家好!👋 今天我们来聊聊一个有趣的话题——如何在归并排序的基础上,高效解决求逆序对数量的问题。如果你对算法感兴趣,或者正在准备算法面试,这篇文章一定会对你有所帮助!🚀 …...

一组开源、免费、Metro风格的 WPF UI 控件库
前言 今天大姚给大家分享一个开源、免费、Metro风格的 WPF UI 控件库:MahApps.Metro。 项目介绍 MahApps.Metro 是一个开源、免费、Metro风格的 WPF UI 控件库,提供了现代化、平滑和美观的控件和样式,帮助开发人员轻松创建具有现代感的 Win…...

Spring Security 应用详解
Spring Security 应用详解 集成SpringBootSpring Boot 介绍创建maven工程spring 容器配置Servlet Context配置安全配置测试 工作原理结构总览认证流程认证流程AuthenticationProviderUserDetailsServicePasswordEncoder 授权流程授权流程授权决策 自定义认证自定义登录页面认证…...

业务对象和对象的区别
"业务对象"和"对象"这两个术语在日常编程和软件工程中经常被使用,但它们之间存在一些区别,主要体现在它们的目的、范围和抽象层次上。 ### 对象(Object) 1. **定义**: - 对象是面向对象编程&#…...