网站怎么做关键词内链网站域名注册商
- 作者: 五速梦信息网
- 时间: 2026年03月21日 07:21
当前位置: 首页 > news >正文
网站怎么做关键词内链,网站域名注册商,一个网站需要多少网页,wordpress 画图插件软硬连接和动静态库 1. 软链接1.1. 概念1.2. 特点1.3. 应用场景 2. 硬链接2.1. 概念2.2. 硬链计数2.3. 特点2.4. 应用场景 3. 动静态库3.1 库存在的原因3.2. 静态库制作与使用3.2.1 打包3.2.2. 使用 3.3. 动态库制作与使用3.3.1. 打包3.3.2. 使用 4. 解决动态库查不到的4种方法… 软硬连接和动静态库 1. 软链接1.1. 概念1.2. 特点1.3. 应用场景 2. 硬链接2.1. 概念2.2. 硬链计数2.3. 特点2.4. 应用场景 3. 动静态库3.1 库存在的原因3.2. 静态库制作与使用3.2.1 打包3.2.2. 使用 3.3. 动态库制作与使用3.3.1. 打包3.3.2. 使用 4. 解决动态库查不到的4种方法4.1. 库安装4.2. 软链接4.3. /etc/ld.so.conf.d配置文件4.4. LD_LIBRARY_PATH环境变量 5. 动静态链接的选择6. 理解动态库加载6.1. 站在OS角度理解6.2. 编址6.3. 理解动态链接和加载问题6.3.1. 一般程序的加载6.3.2. 动态库的加载 1. 软链接 1.1. 概念 软链接概念也称为符号链接是一种特殊类型的独立文件它不直接包含文件的实际内容而是包含了指向目标文件或目录的路径类似于Windows中的快捷方式。当访问链接时系统会根据链接中存储的路径找到并访问目标文件或目录。 ln -s 目标路径 链接路径 1.2. 特点 存储内容软链接文件不直接包含文件的实际内容而是包含了指向目标文件或目录的路径字符串。 独立文件软链接文件在文件系统中是一个独立文件拥有自己的inode编号和属性。 访问方式通过软链接访问文件或目录时系统首先读取软链接文件中的内容(即路径信息)然后根据该路径找到并访问实际的目标文件或目录。 跨文件系统软链接可以跨文件系统使用即可以链接到不同文件系统中的文件或目录。 删除与移动如果目标文件被删除或移动软链接将变为无效(即死链接)但删除软链接本身不会影响目标文件或目录。 1.3. 应用场景 快速访问文件当某个文件位于深层次的目录中通过创建一个指向该文件的软链接就可以快速访问到该文件简化了文件访问过程。这类似于Windows中的快捷方式。 动态库版本管理对于共享库可以使用软链接来管理不同版本动态库之间的切换。如创建一个指向最新版本动态库的软链接当库升级时仅需要更新软链接指向新版本的动态库。
- 硬链接
2.1. 概念
硬链接概念指多个文件名指向同一个物理文件的链接关系。这些链接在文件系统中具有相同的inode编号但可以位于不同的目录中。
建立硬链接并没有新建文件而是为文件创建了新的文件名硬链接不是一个独立的文件因为inode与目标文件的inode相同。
硬链接本质是在指定目录下插入新的文件名和inode之间的映射关系并让inode中的硬链接计数。 ln 源路径 硬链接路径 2.2. 硬链计数
一、硬链接计数的概念
概念在linux中每个inodo中都有一个硬链接计数它表示有多少个文件名指向这个inode。
二、硬链接计数的变化场景 创建文件当创建一个新文件时这个文件的硬件计数默认为1因为此时只要一个文件名指向这个inode。 创建硬链接当使用ln创建一个文件的硬链接不会创建一个新的文件只会为该文件创建一个新的文件名并增加inode中的硬链接计数。 删除文件当删除一个文件时会删除指向该文件的文件名并减少inode中的硬链接计数如果此时硬链接计数等于0文件才会被删除系统回收该inode及其所占的磁盘空间。
三、硬链接计数的限制 不能跨文件系统硬链接只能在同一文件系统内创建不能跨文件系统或分区因为inode只在分区内唯一。 不支持目录在linux中默认情况下不能对目录创建硬链接否则会导致环路问题。 问为什么目录链接计数默认不为1 Linux中每个目录都包含两个特殊的目录 “.“和”. .”.“代表当前目录”. .代表上级目录它们在目录被创建时就自动生成并作为硬链接存在。 Tips一个目录下子目录数 主目录硬链接计数 - 2。 2.3. 特点 共享inode硬链接与原始文件共享同一个inode编号意味着它们指向同一个物理文件的数据块对物理文件所做的任何更改都将反映在所有硬链接上。 增加访问路径创建硬链接实际上是为文件增加了一个新的访问路径或文件名。 无差别访问无论通过哪个文件名访问文件都指向同一个inode即指向同一个文件内容。因此硬链接与原始文件无差别二者等价。 节省空间由于硬链接共享相同的inode和数据块因此它们不会占用额外都磁盘空间。 删除与移动如果删除目标文件或硬链接只要inode中的硬链接计数不为0文件仍可以被硬链接访问直到硬链接计数0文件才被真正删除。 只能在同一文件系统(分区)内创建不允许对目录创建硬链接。
2.4. 应用场景 硬链接应用场景如下数据备份、数据共享、数据恢复、版本控制、自动同步等。 - 动静态库
库文件将多个对象文件(.o文件)打包在一起的文件。
如果我希望其他人能够使用我编写的方法通常的方法是提供一组同名方法.o文件(预编译的对象文件)然后将所有.o文件打包形成一个库文件和相应的同名方法.h头文件。即库文件 头文件。
3.1 库存在的原因
提高开发效率。
库底层封装了重复的代码和常用的功能使得开发者在编写项目时可以直接使用这些现成的代码而无需从头开始编写这大大减少了开发的时间提高了开发效率。
隐藏源代码。
这意味着用户只能看到库提供的接口(通过头文件.h)而无法直接访问或修改库中的源代码这有助于保护开发者的知识产权和代码实现。
3.2. 静态库制作与使用
#includemy_add.hint my_add(int a, int b)
{return a b;
}#includemy_sub.hint my_sub(int a, int b) {return a - b;
}3.2.1 打包 ar [options] archive-file object-files archive-file是静态库名(lib库名.a)object-files是要添加到库中的对象名(.o文件)。 常见的选项
-c创建库文件如果库已存在则会被覆盖。 -r向库文件中添加.o文件如果.o文件已在库中存在则会被替换。 -t列出库文件中包含的.o文件列表。 -v在执行过程中显示详细的信息。 第一步编译形成 .o 文件。 第二步使用ar命令将所有.o文件进行打包形成静态库文件。 第三步将库进行标准化。 库的标准化通常将头文件或库文件分别放在不同的文件夹中可以提高项目的可维护性和组织性。 libmyc.a:my_add.o my_sub.o //第二步使用ar命令将所有.o文件进行打包形成静态库文件ar -rc \( \)^%.o:%.c //第一步编译形成 .o 文件gcc -c \(.PHONY:clean clean:rm -rf *.a *.o mylib mylib.tgz.PHONY:output //第三步将库进行标准化 output: mkdir -p mylib/includemkdir -p mylib/lib cp -rf *.h mylib/include/cp -rf *.a mylib/lib/tar czf mylib.tgz mylib 3.2.2. 使用 #includemy_add.h #includemy_sub.hint main() {int a 4, b 3;printf(%d %d %d\n, a, b, my_add(a, b));printf(%d - %d %d\n, a, b , my_sub(a, b));return 0; }-I(i的大写)用来指定编译器搜索头文件的额外路径。 当编译器在编译过程中遇到#include指令时它先会在标准的位置(当前目录或系统默认的头文件路径)来查找指定的头文件如果查找不到编译器就会使用-I指定的路径进行搜索。 -L用来指定链接器搜索库文件的额外路径。 当链接器在链接中需要找到某个库文件(.so、.a)它先会在标准的位置(系统默认的库路径)中查找如果查找不到链接器就会使用-L指定的路径进行搜索。 -l(L的小写)用来指定链接器在链接过程中要链接的库。 补充头文件的搜索路径当前目录、系统默认的头文件路径(/usr/include、/usr/local/include)、gcc内置的标准头文件路径、命令行中通过-l选项指定的头文件路径。 库文件的搜索路径系统默认的库文件路径(/usr/lib、/usr/local/lib)、gcc内置的库文件路径、命令行中通过-L选项指定的库文件路径、环境变量LIBARY_PATH中指定的路径。 这些选项分别用于控制编译和链接过程中的头文件、库文件的搜索路径和库文件的选择。 3.3. 动态库制作与使用 3.3.1. 打包 第一步使用-fPIC选项编译形成 .o 文件。 -fPIC用于指示编译器生成与位置无关的代码无论代码被加载到内存的哪个位置它都能正确运行而不依赖于它在编译或加载时的具体地址。这种特性通过使用相对寻址而不是绝对寻址来实现的。这对于创建共享库是至关重要的因为共享库可以在进程地址空间的任何位置被加载。 第二步使用-shared将所有.o文件进行打包形成动态库文件。 -shared告诉编译器gcc生成一个共享库(.so或.dll文件)。 第三步将库进行标准化。 libmyc.so:my_add.o my_sub.o //第二步使用-shared将所有.o文件进行打包形成动态库文件gcc -shared -o \) \(^%.o:%.c //第一步使用-fPIC选项编译形成 .o 文件gcc -c -fPIC \).PHONY:clean
clean:rm -rf *.so *.o mylib mylib.tgz.PHONY:output //第三步将库进行标准化 output: mkdir -p mylib/includemkdir -p mylib/lib cp -rf *.h mylib/include/cp -rf *.so mylib/lib/tar czf mylib.tgz mylib 3.3.2. 使用 现象程序运行时OS加载动态库文件myc失败即系统找不到这个文件。 分析如下a. 静态库在编译阶段会被链入到可执行程序中即库的代码和数据会被直接拷贝到最终可执行程序中程序在运行时不在需要静态库文件。 b.动态库在编译时只需要找到头文件包含了对库中函数和数据的引用(通常是符号名和地址偏移量)程序在运行时OS需要找到动态库文件以便将库中的代码和数据加载到内存中。如果OS找不到动态库文件程序无法加载从而导致运行时错误。 - 解决’动态库查不到’的4种方法
4.1. 库安装 将库或其他软件安装到系统中本质是把对应的文件拷贝到系统默认的搜索路径中。 在64位系统系统中库默认的搜索路径为/lib64、/usr/lib64在32系统系统中库默认的搜索路径为/lib、/usr/lib。 4.2. 软链接 4.3. /etc/ld.so.conf.d配置文件
/etc/ld.so.conf.d目录下的配置文件用来指定额外的库文件的搜索路径以便动态链接器能够在运行时找到并加载这些库文件。 4.4. LD_LIBRARY_PATH环境变量
LD_LIBRARY_PATH是一个环境变量在linux中为动态链接器指定额外的库搜索路径。 5. 动静态链接的选择
动静库同时存在gcc默认会使用动态库进行动态链接若想要进行静态链接必须加上-static选项。 只存在静态库可执行程序只能进行静态链接程序不一定整体是静态链接的。
可执行程序只能进行静态链接指的是对于特定库的链接方式 当系统中只存在某个库的静态版本任何尝试链接到这个库的程序都必须使用使用静态链接因为动态链接器在运行时无法找到这个库的动态版本。
程序不一定整体是静态链接的取决于它所依赖的所有库以及编译链接时的选项 一个程序可能依赖于多个库此外即使程序使用了静态链接来链接某些库时它仍可能依赖于动态链接的库(C、C标准库或系统库)这些库在OS级别上提供且以动态链接的形式存在以便在多个程序之间共享。 只存在动态库只能进行动态链接若非得进行静态链接编译器或链接器会报错。 6. 理解动态库加载
6.1. 站在OS角度理解
一、动态库概念
动态库也称为共享库是一种包含代码和数据可以在多个程序之间共享的文件存放在磁盘上。
与静态库不同静态库在程序编译时会被完全复制到可执行文件中而共享库则在程序运行时被加载到内存中如果多个程序使用同一个共享库OS会让这些进程共享内存中的同一份库代码和数据即动态库的代码和数据在内存中只存在一份。
管理系统中可以同时存在多个已经被加载的库OS需要管理它们先描述(包含了加载地址等信息)、再组织。
二、动态库加载的过程 检查依赖程序启动时动态链接器会检查该程序依赖的所有动态库。 搜索路径动态链接器会在预设的库搜索路径中查找所需的动态库文件。 加载与映射第一次加载、后续加载。
第一次加载如果动态库尚未被加载到内存中动态链接器会将该库加载到内存中并映射到进程地址空间的共享区中。 后续加载如果其他进程也需要共享这个库动态链接器会检查内存中是否已存在该库如果已存在只需修改地址空间中共享区的映射关系指向已存在的库副本如果不存在则重复第一次加载的过程。 优点节省内存、易于更新、提高了程序的性能和安全性。 6.2. 编址 可执行程序在编译和链接完成后就已经具有了明确的格式信息且在文件中按照类别划分了不同的区域 (如:代码段、未初始化数据段(BBS段)、初始化数据段)每个区域都有其对应的地址信息通常是相对地址(虚拟地址)。 编址在编译和链接阶段为程序和库中的符号(变量、函数)分配地址的过程主要有绝对编址、相对编址两种方式。
可编址的范围32位平台[0, 2^32] - [0, 4GB] 64位平台[0, 2^64] - [0, 16GB]。 绝对编址在编译和链接过程中符号的地址是固定的即已经确定了符号的实际的物理内存地址。这种方式要求程序运行时必须加载到特定的物理地址处否则无法正确的运行。 绝对编址中的地址 实际的物理内存地址。 在计算机早期程序使用绝对编址因为当时系统比较简单程序通常使用直接映射到物理内存的绝对编址而没有复杂的内存管理和保护机制如虚拟内存、页表等。 相对编制也成为逻辑地址、虚拟地址。在编译和链接过程中符号的地址是不固定的而是相对于某个基地址的偏移量。这种方式允许程序在加载时动态确定实际地址从而实现位置无关代码。 符号地址 基地址 偏移量。基地址在编译链接阶段是未知的通常是由OS在程序加载时分配的虚拟地址是在地址空间内的一个起始地址如0x400000。 现代计算机系统广泛使用相对编址因为这提供了更好的灵活性和安全性。 问地址空间、页表中的数据来自哪里 当基地址确定后OS会使用可执行程序中各个区域的虚拟地址来初始化进程地址空间、页表。每个区域在进程地址空间都有一个相对应的虚拟地址范围。在程序被加载到内存中OS会自动分配物理内存并构建页表来建立虚拟地址和物理地址之间的关系。 每个可执行程序大小不同说明了每个程序中各个区域虚拟地址范围也会不同。相应地当这些程序被加载到内存变为进程时则每个进程地址空间中各个区域的虚拟地址的范围也是不同的。 6.3. 理解动态链接和加载问题 6.3.1. 一般程序的加载 一、一般程序加载的过程 读取可执行文件并解析文件中各个段的信息OS先从存储介质如硬盘中读取可执行文件(程序代码、数据以及依赖的库)然后OS会解析可执行文件中的各个段如代码段、数据段、堆栈段等的信息。这些段包含了程序运行所需的所有指令和数据。 分配虚拟地址空间、并确定基地址。 加载程序段、初始化地址空间OS将可执行文件中的各个段加载到地址空间的相应位置。
4.重定位在加载过程中OS会进行重定位操作。这包括解析程序中的符号引用(如函数名、变量名等)并将它们转换为实际的物理内存地址。 初始化数据段和未初始化数据段、构建页表。 设置程序计数器(PC指针)在程序开始执行之前OS会将PC指针设置为程序入口点的地址(main函数的地址)这是程序执行的第一条指令的虚拟地址。 执行程序CPU会根据程序计数器中的地址从内存中读取指令并执行它。
二、地址空间的构建和管理需要由CPU、编译器、OS三者共同配合完成。 CPU提供硬件支持cr3寄存器存储页表的指针MMU负责将虚拟地址转化为物理地址。 编译器负责将源代码编译成机器码并生成可执行文件这个文件包含了各个段的信息 编译器在编译过程将程序中的符号地址编译成相对于基地址的偏移量 OS负责创建地址空间并选择一个基地址 OS负责加载程序的各个段来初始化地址空间并进行重定位来确定实际物理内存 OS负责创建和初始化页表将虚拟地址转化为物理地址 OS处理缺页中断动态分配物理内存。
三、CPU执行程序的过程 OS读取可执行程序表头中的入口地址(main)把它交到CPUCPU的程序计数器指向main函数的虚拟地址0x401020CPU从这个地址开始执行指令取指令(虚拟地址) - 地址转换 - 分析指令 - 执行指令 - 更新PC指针(虚拟地址)。 CPU从当前PC指向的虚拟地址处读取指令即取指令 - CPU中MMU使用页表将虚拟地址0x401020转化为物理地址0x112233即地址转换 - CPU从物理地址0x112233处读取指令并解码指令即分析指令 - CPU根据解码的指令执行相应的操作即执行指令 - 更新程序计数器使其指向下一个指令的地址。 6.3.2. 动态库的加载 对于库的数据和方法的访问都是可以通过库在地址空间的起始地址程序内部的偏移量来实现。
- 上一篇: 网站怎么做更新小米网页怎么制作
- 下一篇: 网站怎么做关键词排名购物app大全
相关文章
-
网站怎么做更新小米网页怎么制作
网站怎么做更新小米网页怎么制作
- 技术栈
- 2026年03月21日
-
网站怎么做反向代理照片制作软件
网站怎么做反向代理照片制作软件
- 技术栈
- 2026年03月21日
-
网站怎么做动态主图个人注册公司的条件
网站怎么做动态主图个人注册公司的条件
- 技术栈
- 2026年03月21日
-
网站怎么做关键词排名购物app大全
网站怎么做关键词排名购物app大全
- 技术栈
- 2026年03月21日
-
网站怎么做来流量如何做好外贸网络营销
网站怎么做来流量如何做好外贸网络营销
- 技术栈
- 2026年03月21日
-
网站怎么做配置文件夹郑州市东区建设环保局官方网站
网站怎么做配置文件夹郑州市东区建设环保局官方网站
- 技术栈
- 2026年03月21日
