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

动静态库概念及创建

注意在库中不能写main()函数。

复习gcc指令 预处理-E-> xx.i 编译 -S-> xx.s 汇编 -c-> xx.o

汇编得到的 xx.o称为目标可重定向二进制文件,此时的文件需要把第三方库链接进来才变成可执行程序。

gcc -o mymath main.c myadd.c mysub.c得到的mymath可以执行

gcc -o mymath main.o myadd.o mysub.o得到的mymath可以执行

故可以不给别人源码.c文件,只给别人重定位目标二进制文件.o文件【方法实现】也是可以的,当然头文件【方法声明】也得给对方,才能通过编译。

思路:将*.o所有文件整体打包,给对方提供库文件!多个.o打包形成1个.o文件(库),其中打包的方式就决定了动静态库。

结论:1、库相当于*.o文件的集合;2、交付库==库文件.a/.so+头文件.h;

静态库

静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。

使用方法

生成静态库代码: ar -rc libxxx.a *.o ar-archive-归档,Makefile文件内容

查看静态库中的目录列表ar -tv libxxx.a

libmymath.a:mysub.o myadd.oar -rc $@ $^
mysub.o:mysub.cgcc -c mysub.c -o mysub.o
myadd.o:myadd.cgcc -c myadd.c -o myadd.o.PHONY:output
output:mkdir -p mylib/includemkdir -p mylib/libcp -f *.a mylib/libcp -f *.h mylib/include.PHONY:clean
clean:rm *.o libmymath.a

接着打包tar czf mylib.tgz mylib,正常流程就是把mylib.tgz放到yum资源,供人下载,别人下载然后解压tar xzf mylib.tgz,接着安装cp mylib/include/*.h /user/include/cp mylib/lib/*.o /user/lib/

若要链接第三方库,必须要指明库的名称!以及指明库所在的路径!gcc编译指定路径 -I选项(头文件所在路径) -L选项(库文件所在路径) -l选项(库文件名称)gcc -o mymath main.c -I ./mylib/include -L ./mylib/lib -l mymath注意库名称是去掉lib和.a/.so!

那为什么平时直接编译不用指明路径和库名称?因为gcc就只是编译C语言(只需要libc.a),g++就是编译C++的(只需要C++的库)。

接下来看代码如何制作静态库。

[yyq@VM-8-13-centos 2023_02_09_lib_dll]$ ll
total 12
-rw-rw-r-- 1 yyq yyq  213 Feb  9 15:01 main.c
drwxrwxr-x 4 yyq yyq 4096 Feb  9 13:47 mylib
[yyq@VM-8-13-centos 2023_02_09_lib_dll]$ gcc -o mymath main.c -I ./mylib/include -L ./mylib/lib -l mymath
[yyq@VM-8-13-centos 2023_02_09_lib_dll]$ ll
total 24
-rw-rw-r-- 1 yyq yyq  213 Feb  9 15:01 main.c
drwxrwxr-x 4 yyq yyq 4096 Feb  9 13:47 mylib
-rwxrwxr-x 1 yyq yyq 8480 Feb  9 15:03 mymath
[yyq@VM-8-13-centos 2023_02_09_lib_dll]$ ./mymath
Enter Add Func:> 10 + 20 = ?
result:>30
Enter Sub Func:> 10 - 20 = ?
result:>-10
[yyq@VM-8-13-centos 2023_02_09_lib_dll]$ ldd mymath//怎么都是动态链接的库呢??怎么看不到我们自己写的库名称?linux-vdso.so.1 =>  (0x00007fff23bb7000)libc.so.6 => /lib64/libc.so.6 (0x00007fca344ce000)/lib64/ld-linux-x86-64.so.2 (0x00007fca3489c000)
[yyq@VM-8-13-centos 2023_02_09_lib_dll]$ file mymath//为什么属性也是动态链接库呢??
mymath: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0f7725a095306499436d1394ed0d0ac1e5308b02, not stripped
//因为gcc默认是动态链接,对于特定的库取决于库本身是动态库还是静态库。要静态链接需要选项-static,动态库只能动态链接,静态库只能静态链接,动静都有默认动态。
//只要有1个动态库,那这个可执行程序就是动态链接的。

直接在命令行使用gcc太慢了,改进方法:1、把库放到系统路径/usr/include//lib64/

原理

首先,静态库不需要加载到内存,是在链接阶段,将汇编生成的目标重定向二进制文件.o与引用到的库一起链接打包到可执行文件,即直接把那段需要的库代码拷贝到程序对应的代码段中【程序未被加载到内存的时候,就已经形成了虚拟地址(空间代码段、已初始化未初始化数据区、全局数据区),程序没有栈区和堆区】。当程序load到内存中,形成进程地址空间时,就有确定的地址位置(即进程地址空间的代码区只能访问程序的代码区)。

存在的问题

1、空间浪费。静态库在内存中存在多份拷贝导致空间浪费,

2、静态库对程序的更新、部署和发布页不友好。如果静态库libxx.lib更新了,所有使用它的应用程序都需要重新编译、发布给用户(对于用户来说,只是一个很小的改动,却导致整个程序重新下载,全量更新)。

动态库

动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。

一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)。动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。

使用方法

生成动态库的代码

gcc -fPIC -c mysub.c myadd.c

gcc -shared -o libmymath.so *.o

[yyq@VM-8-13-centos dynamicFile]$ ll
total 16
-rw-rw-r-- 1 yyq yyq 114 Feb  9 15:57 myadd.c
-rw-rw-r-- 1 yyq yyq  57 Feb  9 15:57 myadd.h
-rw-rw-r-- 1 yyq yyq 114 Feb  9 15:57 mysub.c
-rw-rw-r-- 1 yyq yyq  56 Feb  9 15:57 mysub.h
[yyq@VM-8-13-centos dynamicFile]$ gcc -fPIC -c myadd.c
[yyq@VM-8-13-centos dynamicFile]$ gcc -fPIC -c mysub.c
[yyq@VM-8-13-centos dynamicFile]$ ll
total 24
-rw-rw-r-- 1 yyq yyq  114 Feb  9 15:57 myadd.c
-rw-rw-r-- 1 yyq yyq   57 Feb  9 15:57 myadd.h
-rw-rw-r-- 1 yyq yyq 1592 Feb  9 15:59 myadd.o
-rw-rw-r-- 1 yyq yyq  114 Feb  9 15:57 mysub.c
-rw-rw-r-- 1 yyq yyq   56 Feb  9 15:57 mysub.h
-rw-rw-r-- 1 yyq yyq 1592 Feb  9 15:59 mysub.o
[yyq@VM-8-13-centos dynamicFile]$ gcc -shared -o libmymath.so *.o
[yyq@VM-8-13-centos dynamicFile]$ ll
total 32
-rwxrwxr-x 1 yyq yyq 8088 Feb  9 15:59 libmymath.so
-rw-rw-r-- 1 yyq yyq  114 Feb  9 15:57 myadd.c
-rw-rw-r-- 1 yyq yyq   57 Feb  9 15:57 myadd.h
-rw-rw-r-- 1 yyq yyq 1592 Feb  9 15:59 myadd.o
-rw-rw-r-- 1 yyq yyq  114 Feb  9 15:57 mysub.c
-rw-rw-r-- 1 yyq yyq   56 Feb  9 15:57 mysub.h
-rw-rw-r-- 1 yyq yyq 1592 Feb  9 15:59 mysub.o
[yyq@VM-8-13-centos dynamicFile]$ file libmymath.so 
libmymath.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=bcfe08193c5605299db2b28596b7b96dedb08ab3, not stripped
[yyq@VM-8-13-centos dynamicFile]$ ldd libmymath.so linux-vdso.so.1 =>  (0x00007ffe02142000)libc.so.6 => /lib64/libc.so.6 (0x00007f66e790e000)/lib64/ld-linux-x86-64.so.2 (0x00007f66e7ede000)
[yyq@VM-8-13-centos mylib_dynamic]$ gcc -o mymath main.c -I./mylib/include -L./mylib/lib -lmymath//与静态库同样的编译代码再去编译形成可执行程序没问题,但是在执行时会报错,为什么呢?因为这里的指令都是告诉gcc需要的动态库在哪里以及叫什么名字,我们可以看一下这个可执行程序,它不知道我们自己写的动态库在哪里
[yyq@VM-8-13-centos mylib_dynamic]$ ldd mymath linux-vdso.so.1 =>  (0x00007ffd4e268000)libmymath.so => not foundlibc.so.6 => /lib64/libc.so.6 (0x00007fd9ac027000)/lib64/ld-linux-x86-64.so.2 (0x00007fd9ac3f5000)
//我们知道当gcc把程序编译完形成可执行程序后,后续的执行就与gcc无关了
//且动态库是程序运行后才链接的,程序运行起来就和OS相关了,但是OS不知道需要的动态库在哪叫什么,因此执行时会报错

解决方法1:直接把.so文件拷贝到可执行程序的同级路径下;

解决办法2:把我们写的库放到环境变量LD_LIBRARY_PATH去,但仅限本次登陆有效;

[yyq@VM-8-13-centos mylib_dynamic]$ echo $LD_LIBRARY_PATH
:/home/yyq/.VimForCpp/vim/bundle/YCM.so/el7.x86_64
[yyq@VM-8-13-centos lib]$ pwd
/home/yyq/linux-class/2023_02_09_lib_dll/mylib_dynamic/mylib/lib
[yyq@VM-8-13-centos mylib_dynamic]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/yyq/linux-class/2023_02_09_lib_dll/mylib_dynamic/mylib/lib
//这样可执行程序就能运行了,但是仅在本次登陆有效,下线后再次执行又不能跑了

解决办法3:cd /etc/ld.so.conf.d/在这个路径下我们自己也写一个conf出来;

[yyq@VM-8-13-centos lib]$ ls /etc/ld.so.conf.d/
bind-export-x86_64.conf
dyninst-x86_64.conf
kernel-3.10.0-1160.71.1.el7.x86_64.conf
kernel-3.10.0-1160.76.1.el7.x86_64.conf
mysql-x86_64.conf
[yyq@VM-8-13-centos ld.so.conf.d]$ touch lib.conf
//在里面写出动态库的路径/home/yyq/linux-class/2023_02_09_lib_dll/mylib_dynamic/mylib/lib
[yyq@VM-8-13-centos ld.so.conf.d]$ cat lib.conf
/home/yyq/linux-class/2023_02_09_lib_dll/mylib_dynamic/mylib/lib
//接着更新一下conf,每次都能执行了
[yyq@VM-8-13-centos ld.so.conf.d]$ sudo ldconfig

解决办法4:采用软链接的方式。即在要运行可执行程序的路径下执行ln -s /home/yyq/linux-class/2023_02_09_lib_dll/mylib_dynamic/mylib/lib/libmymath.so libmymath.so

[yyq@VM-8-13-centos mylib_dynamic]$ ll
total 20
-rw-rw-r-- 1 yyq yyq  213 Feb  9 16:06 main.c
drwxrwxr-x 4 yyq yyq 4096 Feb  9 16:03 mylib
-rwxrwxr-x 1 yyq yyq 8432 Feb  9 16:17 mymath
[yyq@VM-8-13-centos mylib_dynamic]$ ln -s /home/yyq/linux-class/2023_02_09_lib_dll/mylib_dynamic/mylib/lib/libmymath.so libmymath.so
[yyq@VM-8-13-centos mylib_dynamic]$ ll
total 24
lrwxrwxrwx 1 yyq yyq   77 Feb  9 16:48 libmymath.so -> /home/yyq/linux-class/2023_02_09_lib_dll/mylib_dynamic/mylib/lib/libmymath.so
-rw-rw-r-- 1 yyq yyq  213 Feb  9 16:06 main.c
drwxrwxr-x 4 yyq yyq 4096 Feb  9 16:03 mylib
-rwxrwxr-x 1 yyq yyq 8432 Feb  9 16:17 mymath

还可以直接把这个软链接直接建到系统默认的库目录下

sudo ln -s /home/yyq/linux-class/2023_02_09_lib_dll/mylib_dynamic/mylib/lib/libmymath.so /lib64/libmymath.so

原理

以上我们所做的都是用gcc来完成编译,即把库路径、库名称、库文件告诉gcc,所以程序可以成功编译。那执行的时候呢?是要通过OS和shell来执行的,而这俩又不知道库路径这些数据,库也不在系统路径下,所以会出现最开始的链接失败的报错。给出的解决方案呢,是让OS和shell知道我们自己写的第三方动态库的名称、路径和文件,才能正确执行。

在执行时,OS将动态库中指定函数的偏移地址写入到我们的可执行程序中,OS提供页表将动态库代码映射到进程地址空间的共享区,此时库立马具备了在地址空间的起始地址,接着就能根据偏移量来找到指定函数(起始地址+偏移量=共享库中的地址->跳转访问)。【之前编译的时候使用该选项-fPIC与地址无关码,以该选项生成的动态库程序代码用的肯定是偏移地址(相对地址)】

  • 动态链接有两种方式:装载时重定位地址无关代码技术
  • 装载时重定位:在链接时对所有绝对地址的引用不作重定位,而把这一步推迟到装载时完成,也叫基址重置,每个指令和数据相当于模块装载地址是固定的,系统会分配足够大的空间给装载模块,当装载地址确定后,那指令和数据地址自然也就确定了。然而动态链接模块被装载映射到虚拟空间,指令被重定位后对于每个进程来讲是不同的,没有办法做到同一份指令被多个进程共享,所以指令对不同的进程来说有不同的副本,还是空间浪费,怎么解决这个问题?使用fPIC方法。
  • 地址无关代码:指令部分无法在多个进程之间共享,不能节省内存,所以引入了地址无关代码的技术。我们平时编程过程中可能都见过-fPIC的编译选项,这个就代表使用了地址无关代码技术来实现真正的动态链接。基本思想就是使用GOT(全局偏移表),这是一个指向变量或函数地址的指针数组,当指令要访问变量或者调用函数时,会去GOT中找到相应的地址进行间接跳转访问,每个变量或函数都对应一个地址,链接器在装载模块的时候会查找每个变量和函数的地址,然后填充GOT中的各个项,确保每个指针指向的地址正确。GOT放在数据段,所以它可以在模块装载时被修改,并且每个进程都可以有独立的副本,相互不受影响。

优点

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行时才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦,用户只需要更新动态库即可,增量更新

第三方库ncurses

ncurses库是用来处理屏幕显示情况的库,直接yum安装

相关文章:

动静态库概念及创建

注意在库中不能写main()函数。 复习gcc指令 预处理-E-> xx.i 编译 -S-> xx.s 汇编 -c-> xx.o 汇编得到的 xx.o称为目标可重定向二进制文件,此时的文件需要把第三方库链接进来才变成可执行程序。 gcc -o mymath main.c myadd.c mysub.c得到的mymath可以执…...

【H.264】码流解析 annexb vs avcc

H264码流解析及NALUAVCC和ANNEXB 前者是FLV容器、mp4 常用的。后者 是实时传输使用,所以是TS 一类的标准。VLC显示AVC1就是AVCC AVCC格式 也叫AVC1格式,MPEG-4格式,字节对齐,因此也叫Byte-Stream Format。用于mp4/flv/mkv, VideoToolbox。 – Annex-B格式 也叫MPEG-2 trans…...

【最优化方法】1-最优化方法介绍

文章目录1 最优化起源2 最优化发展3 运筹学在国外4 运筹学在国内5 什么是最优化?6 为什么要研究最优化问题?7 最优化问题8 最优化问题分类9 最优化研究内容理论算法应用1 最优化起源 中国古代优化思想–田忌赛马(公元前340年) 18世纪L.Euler&#xff0…...

数据结构 | 树 | 二叉树

🔥Go for it!🔥 📝个人主页:按键难防 📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 📖系列专栏:数据结构与算法 &#x1f52…...

笔记:使用 unbuild 搭建 JavaScript 构建系统笔记

使用 unbuild 搭建 JavaScript 构建系统jcLee95:https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 :291148484163.com 简介: 本文是笔者阅读分析 elementPlus 项目时记录的。该项目用到了一个完全没有文档和资料的工具 unbu…...

【SpringBoot3.0源码】启动流程源码解析 •下

文章目录初始化DefaultBootstrapContext开启Headless模式获取监听器并启动封装命令行参数准备环境打印Banner创建上下文容器预初始化上下文容器刷新Spring容器打印启动时间发布事件执行特定的run方法上一篇《【SpringBoot3.0源码】启动流程源码解析 • 上》,主要讲解…...

QT(56)-动态链接库-windows-导出变量-导出类

1.导出变量 1.1不使用_declspec(dllimport) _declspec(dllexport) 使用_declspec(dllimport) _declspec(dllexport) 1.2win32 mydllwin32 myexe 1.3win32 mydllqt myexe 2.导出类 使用_declspec(dllimport) _declspec(dllexport) 2.1不用关键…...

TCP传输文件

传输文件和传输信息的区别: 传输信息,只是一条数据,传输文件是多条数据传输信息传输过去一般都会显示,传输文件一般不会显示,一般只是存放在文件中传输文件需要传输,文件大小和文件名称(不然不知…...

vue3:加载本地图片等静态资源

背景 在我们用 vue2 webpack 的时候&#xff0c;加载图片资源是这样用的&#xff1a; <img :src"require(/assets/test.png)" />这样打包后就会触发 file-loader 打包图片资源&#xff0c;在 dist 文件夹中就可以看到这个图片&#xff08;如果图片较小会打包…...

工作记录------数据库group_concat函数长度问题

工作记录------group_concat函数长度问题 背景&#xff1a;页面在数据展示时&#xff0c;报错&#xff0c;错误显示&#xff1a;String index out of range: -1 异常信息 java.lang.StringIndexOutOfBoundsException: String index out of range: -1at java.lang.String.sub…...

Python基础语法

1 编程环境 1.1 编译环境 pycharmpython/anaconda 1.2 环境设置 File -> settings -> Project interpreter -> 1.3 Hello world 2 条件判断 2.1 例题 【题1】输入一个年份&#xff0c;判断是否是闰年 ①能被4整除&#xff0c;但不能被100整除; ②能被400整…...

windows环境下安装Nginx及常用操作命令

windows环境下安装Nginx及常用操作命令nginx基本概述基本用途nginx安装nginx基本概述 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器。基本用途 nginx是一个轻量级高并发服务器&#xff0c;而tomcat并不是。nginx一般被用来做反向代理&#xff0c;将请求转发到应用…...

python excel数据处理?

前段时间做了个小项目&#xff0c;帮个海洋系的教授做了个数据处理的软件。基本的功能很简单&#xff0c;就是对Excel里面的一些数据进行过滤&#xff0c;统计&#xff0c;对多个表的内容进行合并等。之前没有处理Excel数据的经验&#xff0c;甚至于自己都很少用到Excel。记得《…...

Hudi-集成Flink

文章目录集成Flink环境准备sql-client方式启动sql-client插入数据查询数据更新数据流式插入code 方式环境准备代码类型映射核心参数设置去重参数并发参数压缩参数文件大小Hadoop参数内存优化读取方式流读&#xff08;Streaming Query&#xff09;增量读取&#xff08;Increment…...

重新认识 React Hooks useContext

通常来说,React 数据的传递方式都是一层一层把资料 props 传到子层的 就算第二层(Function Component)、第三层(Button Group Compontn) 根本没有用到这个资料,但是为了传到最底层(button) ,每一层还是必须要传props // App.js const App = () => {const [dark, setDark…...

数据库(2)--加深对统计查询的理解,熟练使用聚合函数

一、内容要求 利用sql建立学生信息数据库&#xff0c;并定义以下基本表&#xff1a; 学生&#xff08;学号&#xff0c;年龄&#xff0c;性别&#xff0c;系号&#xff09; 课程&#xff08;课号&#xff0c;课名&#xff0c;学分&#xff0c;学时&#xff09; 选课&#xff0…...

stm32f407探索者开发板(十五)——NVIC中断优先级管理

文章目录零、前言一、NVIC中断优先级分组1.1 中断的管理方法1.2 抢占优先级&相应优先级的区别1.3 举例1.4 特别说明1.5 中断优先级分组函数二、NVIC中断优先级设置2.1 中断设置相关寄存器2.2 中断设置优先级2.2.1 中断优先级控制的寄存器组 IP[240]2.2.2 中断使能寄存器组 …...

【Azure 架构师学习笔记】-Azure Logic Apps(6)- Logic Apps调用ADF

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Logic Apps】系列。 接上文【Azure 架构师学习笔记】-Azure Logic Apps&#xff08;5&#xff09;- 标准和使用量类型的区别 前言 Logic Apps 和 ADF 的搭配使用是常见的组合&#xff0c;它们可以互相弥补各自的不足和…...

python随机获取列表中某一元素

1、利用Python中的random模块中的choice方法 random.choice()可以从任何序列&#xff0c;比如list列表中&#xff0c;选取一个随机的元素返回&#xff0c;可以用于字符串、列表、元组等。 import random arr[1,2,3,4,5,6] print(random.choice(arr))2、利用Python中的random模…...

Nacos微服务笔记

Nacos安装Nacos 的 Github&#xff08;Tags alibaba/nacos GitHub&#xff09;下载我们所需的 Nacos 版本&#xff0c;可以选择 windows 或者 Linux。 进入官网&#xff0c;选择合适版本&#xff0c;tar.gz为linux版本&#xff0c;zip为windows版本。下载并解压 nacos-server…...

MAC文件误删怎么办?mac数据恢复,亲测很好用的方法

电脑文件误删&#xff0c;应该很多人都经历过。之前分享了很多关于Windows电脑文件误删如何恢复的方法&#xff0c;那么MAC电脑文件误删该怎么办&#xff1f;有什么好方法可以使得mac数据恢复回来吗&#xff1f;下面就给大家分享一些亲测好用的方法&#xff01; 一、MAC电脑的文…...

机械革命z2黑苹果改造计划第二番-MacOS实用软件渗透工具

机械革命z2黑苹果改造计划第二番-实用软件 Mac实用工具 这是旧电脑改造计划的第二篇&#xff0c;就是安装一些常用软件和一些渗透测试工具&#xff0c;武装灵魂成为真正的生产力工具 首先推荐一个网站&#xff0c;www.mactools.app&#xff0c;这个软件里边有大多数常用的软…...

【LeetCode】每日一题(4)

目录 题目&#xff1a;1124. 表现良好的最长时间段 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 写在最后&#xff1a; 题目&#xff1a;1124. 表现良好的最长时间…...

Linux内核移植:内核的启动过程分析、启动配置与rootfs必要文件

Linux内核移植&#xff1a;内核的启动过程、启动配置与rootfs必要文件一、启动过程二、启动配置&#xff08;一&#xff09;SysV初始化&#xff08;二&#xff09;systemd初始化三、rootfs中的启动配置文件1、inittab2、/etc/init.d/rcS 脚本3、fstab4、profile 文件5、其他文件…...

【代码随想录训练营】【Day14】第六章|二叉树|理论基础|递归遍历|迭代遍历|统一迭代

理论基础 二叉树的定义形式有&#xff1a;节点指针和数组 在数组中&#xff0c;父节点的下标为i&#xff0c;那么其左孩子的下标即i*21&#xff0c;右孩子的下标即为i*22 二叉树的常见遍历形式有&#xff1a;前序遍历、后序遍历、中序遍历和层序遍历 前序遍历&#xff1a;二…...

AXI-Stream 学习笔记

参考 https://wuzhikai.blog.csdn.net/article/details/121326701 https://zhuanlan.zhihu.com/p/152283168 AXI4 介绍 AXI4 是ARM公司提出的一种片内总线&#xff0c;描述了主从设备之间的数据传输方式。主要有AXI4_LITE、AXI4_FULL、AXI4_STREAM三种。 AXI4_LITE&#xff1…...

【Linux】程序进程地址空间

文章目录程序地址空间进程地址空间程序地址空间 在Linux下,这种地址叫做 虚拟地址, 我们在用C/C语言所看到的地址,全部都是虚拟地址&#xff01;物理地址,用户一概看不到,由OS统一管理 问:C/C程序地址空间是内存吗? -> 根本就不是内存&#xff01; 是进程虚拟地址空间 堆栈…...

电压放大器在液滴微流控芯片的功能研究中的应用

实验名称&#xff1a;电压放大器在液滴微流控芯片的功能研究中的应用研究方向&#xff1a;微流控生物芯片测试目的&#xff1a;液滴微流控技术能够在微通道内实现液滴生成&#xff0c;精准控制生成液滴的尺寸以及生成频率。结合芯片结构设计和外部控制条件&#xff0c;可以对液…...

Linux操作系统学习(进程地址空间)

文章目录进程地址空间奇怪的现象什么是进程地址空间&#xff1f;&#xff1f;&#xff1f;虚拟地址是如何与物理内存联系的&#xff1f;页表是什么呢&#xff1f;为什么要有页表和地址空间&#xff0c;让进程直接访问内存不行吗&#xff1f;现象解释进程地址空间 在我们学习其…...

【排序】快速排序实现

目录 一、快速排序是什么&#xff1f; 二、左右指针法 1.实现原理 2.代码如下&#xff1a; 三、挖坑法 1.实现原理 2.代码如下&#xff1a; 四、前后指针法 1.实现原理 2.代码如下&#xff1a; 五、三数取中 1.实现思想 2.代码如下&#xff1a; 3.使用方法 总结…...

做网站的公司首选智投未来/av手机在线精品

人生路上甜苦和喜忧愿与你分担所有难免曾经跌倒和等候要勇敢的抬头谁愿常躲在避风的港口宁有波涛汹涌的自由愿是你心中 灯塔的守候在迷雾中让你看透阳光总在风雨后乌云上有晴空珍惜所有的感动每一份希望在你手中阳光总在风雨后请相信有彩虹风风雨雨都接受我一直会在你的左右...

小程序获取wordpress背景音乐/免费自己建网站

2014文都英语&#xff1a;http://pan.baidu.com/s/1i3va0ZF 密码&#xff1a;1eh82014五大机构全程&#xff1a;http://pan.baidu.com/s/1dDGMgnv 密码&#xff1a;pcde2014年新东方范猛阅读&#xff1a;http://pan.baidu.com/s/1pJDjfpp2014海文课程全程班&#xff1a;http://…...

做怎么网站/设计网站logo

在web.config里加上 <appSettings> <add key"FCKeditor:UserFilesPath" value"/xsc/UserFiles/" /> </appSettings> 转载于:https://www.cnblogs.com/lancelang/archive/2007/08/20/862716.html...

现代网站建设/百度云网盘网页版登录

$好玩的分词——python jieba分词模块的基本用法 jieba&#xff08;结巴&#xff09;是一个强大的分词库&#xff0c;完美支持中文分词&#xff0c;本文对其基本用法做一个简要总结。 安装jieba pip install jieba 简单用法 结巴分词分为三种模式&#xff1a;精确模式&#xff…...

厦门疫情最新消息/seo培训

#!/bin/bash#####################################################Environment Setting####################################################### #程序代码数组APPS(shop euaker config) #程序名称数组 NAMES(店铺模块 euaker模块 config模块) #jar包JARS(message-pushmsg-…...

常宁网站建设/百度热门排行榜

–ACC建模大数据用于精简用例的实践 作者&#xff1a;emilyxlchen生活的智慧&#xff0c;有时不在于多&#xff0c;而在于少。同理适用于测试用例的管理中。 一&#xff0e;热身活动&#xff1a;数一数你的产品总用例 随着互联网时代节奏的日益加快&#xff0c;许多产品都会…...