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.0my_custom_plugin.soother_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…...
Linux二进制部署K8s集群的平滑升级教程
一、升级前的准备工作 备份集群配置和数据 备份/etc/kubernetes/目录,其中包含Kubernetes集群的配置文件。 备份/var/lib/etcd/目录,其中存储了etcd数据库的数据。 使用etcdctl工具备份etcd数据: bash复制 ETCDCTL_API3 etcdctl snapshot s…...
2.1.3 第一个工程,点灯!
新建工程 点击菜单栏左上角,新建工程或者选择“文件”-“新建工程”,选择工程类型“标准工程”选择设备类型和编程语言,并指定工程文件名及保存路径,如下图所示: 选择工程类型为“标准工程” 选择主模块机型&#x…...
图像处理算法研究的程序框架
目录 1 程序框架简介 2 C#图像读取、显示、保存模块 3 C动态库图像算法模块 4 C#调用C动态库 5 演示Demo 5.1 开发环境 5.2 功能介绍 5.3 下载地址 参考 1 程序框架简介 一个图像处理算法研究的常用程序逻辑框架,如下图所示 在该框架中,将图像处…...
计算机工程:解锁未来科技之门!
计算机工程与应用是一个充满无限可能性的领域。随着科技的迅猛发展,计算机技术已经深深渗透到我们生活的方方面面,从医疗、金融到教育,无一不在彰显着计算机工程的巨大魅力和潜力。 在医疗行业,计算机技术的应用尤为突出。比如&a…...
Linux初识——基本指令(2)
本文将继续从上篇末尾讲起,讲解我们剩下的基本指令 一、剩余的基本指令 1、mv mv指令是move(移动)的缩写,其功能为:1.剪切文件、目录。2.重命名 先演示下重命名,假设我想把当前目录下的di34改成dir5 那…...
单片机-STM32 WIFI模块--ESP8266 (十二)
1.WIFI模块--ESP8266 名字由来: Wi-Fi这个术语被人们普遍误以为是指无线保真(Wireless Fidelity),并且即便是Wi-Fi联盟本身也经常在新闻稿和文件中使用“Wireless Fidelity”这个词,Wi-Fi还出现在ITAA的一个论文中。…...
[C++技能提升]类注册
最近在做AI信息在各个平台流转的框架设计,想要设计一种可以灵活扩展、不改变原有代码的框架,了解到了类注册。 具体需求是这样的:AI算法在客户本地电脑和云端都有部署,原先AI在这两个平台下的输出格式并不统一,且每个…...
OpenHarmony 5.0.2 Release来了!
版本概述 OpenHarmony 5.0.2 Release版本对标准系统的能力进行持续完善,以快速迭代的方式推出API 14,相比5.0.1 Release版本,重点做出了如下特性新增或增强: 进一步增强ArkUI、图形图像的能力,提供更多组件的高级属性…...
80,【4】BUUCTF WEB [SUCTF 2018]MultiSQL
53,【3】BUUCTF WEB october 2019 Twice SQLinjection-CSDN博客 上面这个链接是我第一次接触二次注入 这道题也涉及了 对二次注入不熟悉的可以看看 BUUCTF出了点问题,打不开,以下面这两篇wp作为学习对象 [SUCTF 2018]MultiSQL-CSDN博客 …...
NR_shell运行流程简析
nr_shell 是一套开源 shell 框架,基于框架可创建终端交互功能。 为了记录终端输入指令,以及进行解析处理,nr_shell 提供了一套 cmd 结构体,具体如下:typedef struct static_cmd_function_struct {char cmd[NR_SHELL_CM…...
Prometheus部署及linux、mysql、monog、redis、RocketMQ、java_jvm监控配置
Prometheus部署及linux、mysql、monog、redis、RocketMQ、java_jvm监控配置 1.Prometheus部署1.2.Prometheus修改默认端口 2.grafana可视化页面部署3.alertmanager部署4.监控配置4.1.主机监控node-exporter4.2.监控mysql数据库mysqld_exporter4.3.监控mongod数据库mongodb_expo…...
问题排查 - TC397 CORE2 50MS/100MS任务不运行
1、问题描述 CORE2 的任务运行次数的计数值OsTask_100ms_Core2 - task_cnt[12]、OsTask_50ms_Core2 - task_cnt[16]不在累加,但是其他任务OsAlarm_1ms_Core2、OsAlarm_5ms_Core2、OsAlarm_10ms_Core2、OsAlarm_20ms_Core2 任务计数值累加正常。 如果是任务栈溢出&a…...
Spring FatJar写文件到RCE分析
背景 现在生产环境部署 spring boot 项目一般都是将其打包成一个 FatJar,即把所有依赖的第三方 jar 也打包进自身的 app.jar 中,最后以 java -jar app.jar 形式来运行整个项目。 运行时项目的 classpath 包括 app.jar 中的 BOOT-INF/classes 目录和 BO…...
百度APP iOS端磁盘优化实践(上)
01 概览 在APP的开发中,磁盘管理已成为不可忽视的部分。随着功能的复杂化和数据量的快速增长,如何高效管理磁盘空间直接关系到用户体验和APP性能。本文将结合磁盘管理的实践经验,详细介绍iOS沙盒环境下的文件存储规范,探讨业务缓…...
蓝桥杯之c++入门(一)【第一个c++程序】
目录 前言一、第⼀个C程序1.1 基础程序1.2 main函数1.3 字符串1.4 头文件1.5 cin 和 cout 初识1.6 名字空间1.7 注释 二、四道简单习题(点击跳转链接)练习1:Hello,World!练习2:打印飞机练习3:第⼆个整数练习4ÿ…...
14-6-1C++STL的list
(一)list容器的基本概念 list容器简介: 1.list是一个双向链表容器,可高效地进行插入删除元素 2.list不可以随机存取元素,所以不支持at.(pos)函数与[ ]操作符 (二)list容器头部和尾部的操作 list对象的默…...
【AI论文】Sigma:对查询、键和值进行差分缩放,以实现高效语言模型
摘要:我们推出了Sigma,这是一个专为系统领域设计的高效大型语言模型,其独特之处在于采用了包括DiffQKV注意力机制在内的新型架构,并在我们精心收集的系统领域数据上进行了预训练。DiffQKV注意力机制通过根据查询(Q&…...
InceptionV1_V2
目录 不同大小的感受野去提取特征 经典 Inception 网络的设计思路与运行流程 背景任务:图像分类(以 CIFAR-10 数据集为例) Inception 网络的设计思路 Inception 网络的运行流程 打个比方 多个损失函数的理解 1. 为什么需要多个损失函数&#…...
ORB-SLAM2源码学习:Initializer.cc⑧: Initializer::CheckRT检验三角化结果
前言 ORB-SLAM2源码学习:Initializer.cc⑦: Initializer::Triangulate特征点对的三角化_cv::svd::compute-CSDN博客 经过上面的三角化我们成功得到了三维点,但是经过三角化成功的三维点并不一定是有效的,需要筛选才能作为初始化地图点。 …...
【ArcGIS微课1000例】0141:提取多波段影像中的单个波段
文章目录 一、波段提取函数二、加载单波段导出问题描述:如下图所示,img格式的时序NDVI数据有24个波段。现在需要提取某一个波段,该怎样操作? 一、波段提取函数 首先加载多波段数据。点击【窗口】→【影像分析】。 选择需要处理的多波段影像,点击下方的【添加函数】。 在多…...
【测试人生】变更风险观测的流程逻辑设计
在线上服务变更过程中,我们希望可以通过一套实时观测机制去监测线上服务的风险,从而能够确保线上稳定性,在出问题是可以及时回滚变更。今天这篇文章,就简单讲一下变更风险观测的流程逻辑需要怎么设计。 首先需要明确变更观测的相…...
一文大白话讲清楚webpack基本使用——17——Tree Shaking
文章目录 一文大白话讲清楚webpack基本使用——17——Tree Shaking1. 建议按文章顺序从头看,一看到底,豁然开朗2. 啥叫Tree Shaking3. 什么是死代码,怎么来的3. Tree Shaking的流程3.1 标记3.2 利用Terser摇起来 4. 具体使用方式4.1 适用前提…...
ChatGPT从数据分析到内容写作建议相关的46个提示词分享!
在当今快节奏的学术环境中,研究人员面临着海量的信息和复杂的研究任务。幸运的是,随着人工智能技术的发展,像ChatGPT这样的先进工具为科研人员提供了强大的支持。今天就让我们一起探索如何利用ChatGPT提升研究效率进一步优化研究流程。 ChatG…...
PyCharm配置Python环境
1、打开PyCharm项目 可以从File-->Open-->选择你的项目路径-->OK,或者直接点击Open,找到项目路径-->OK,如图所示(点击Ok后可能有下面的弹窗,选择“Trust Project”即可,然后选择“New Window”打开项目) …...
c#配置config文件
1,引用命名空间 Configuration 及配置信息...
RDMA 工作原理 | 支持 RDMA 的网络协议
注:本文为 “RDMA” 相关文章合辑。 英文引文机翻未校。 图片清晰度受引文所限。 Introduction to Remote Direct Memory Access (RDMA) Written by: Dotan Barak on March 31, 2014.on February 13, 2015. What is RDMA? 什么是 RDMA? Direct me…...
01-硬件入门学习/嵌入式教程-CH340C使用教程
前言 CH340C广泛应用于DIY项目和嵌入式开发中,用于USB数据转换和串口通信。本文将详细介绍CH340C的基本功能、引脚接线及使用方法。 CH340C简介 CH340C是一款USB转TTL电平转换器,可以将电脑的USB数据转换成串口数据,方便与单片机ÿ…...
STM32——LCD
一、引脚配置 查看引脚 将上述引脚都设置为GPIO_Output 二、导入驱动文件 将 LCD 驱动的 Inc 以及 Src 中的 fonts.h,lcd.h 和 lcd.c 导入到自己工程的驱动文件中。 当然,后面 lcd 的驱动学习可以和 IMX6U 一块学。 三、LCD函数 void LCD_Clear(u16 Color); 功能…...
破解浏览器渲染“死锁”:CSS与JS如何影响页面加载速度?
破解浏览器渲染“死锁”:CSS与JS如何影响页面加载速度? 在这个快速发展的Web世界里,性能是开发者们永恒的追求。当你打开一个网页,可能会注意到一些页面加载特别慢,甚至产生短暂的“白屏”,你有没有想过&a…...
