经典的响应式布局网站,短网址生成地址,常见的网站推广方法有哪些,h5网站不利于优化吗软硬链接和动静态库 1.软硬链接2.动态库和静态库2.1理解现象2.2静态库的设计2.3动态库2.4动态库的配置2.5动态库的理解 #x1f31f;#x1f31f;hello#xff0c;各位读者大大们你们好呀#x1f31f;#x1f31f; #x1f680;#x1f680;系列专栏#xff1a;【Linux… 软硬链接和动静态库 1.软硬链接2.动态库和静态库2.1理解现象2.2静态库的设计2.3动态库2.4动态库的配置2.5动态库的理解 hello各位读者大大们你们好呀 系列专栏【Linux的学习】 本篇内容软硬链接动静态库 ⬆⬆⬆⬆上一篇基础IO二 作者简介轩情吖请多多指教( •̀֊•́ ) ̖́- 1.软硬链接
①软链接是一个独立的链接文件有自己的inode编号因此也有自己的inode属性和内容其内容是自己所指向的文件的路径类似于windows快捷方式 创建软链接命令ln -s ②硬链接和目标文件共用同一个inode编号因此硬链接一定和目标文件使用同一个inode属性。硬链接没有独立的inode在当前目录的内容中建立新的文件名和老的inode的映射关系 创建硬链接的命令ln 仔细观察红色圈出来的地方为什么它是2 其实它指的是硬链接数在inode属性中有一个来变量记录这个 大家注意看红色圈出来的地方其中创建一个dir目录后它的硬链接数为2这是因为它本身是一个再加上其内部的 . .用来切换到上一级路径也是指向这个目录因此为2,。而这个目录中的 . 为3个硬链接数的原因是本身一个上一级目录下它本身的目录名算一个再者dir中有一个. .切换到上级目录也算一个。 但是只有OS能给目录建立硬链接因为我们自己建立的容易造成环路路径问题例如使用find会引起死循环
2.动态库和静态库
系统已经预装了C/C的头文件和库文件头文件是提供方法说明库提供方法的实现头和库是有对应关系的是要组合在一起使用的 头文件是在预处理阶段就引入的链接本质其实是链接库 查看C动态库/usr/lib64/libc* 或 /lib64/libc*
查看C动态库/usr/lib64/libstdc* 或 /lib64/libstdc*
查看头文件/usr/include
2.1理解现象
a.所有我们在VS2019/2022下安装开发环境——安装编译器软件安装要开发的语言配套的库和头文件 b.我们在使用编译器都会有语法的自动提醒功能需要包含头文件的。语法的提醒本质编译器或编辑器它会自动的将用户输入的内容不断在被包含的头文件中进行搜索自动提醒功能是依赖头文件的 c.我们在写代码的时候我们的环境怎么知道我们的代码中有哪些地方有语法报错其实是有命令行模式还有其他自动化的模式帮我们不断在进行语法检查 d.库静态库.a;动态库.so e.库名lib stdc.so.6 f.一般云服务器默认只会存在动态库不存在静态库静态库需要单独安装
2.2静态库的设计
我们首先写一个函数的实现 再写一个普通的.c文件其中包含了函数原型的头文件 此时我们再考虑一个问题当我们的c文件在编译时只要有函数的声明就不会出现报错因为编译器认为在后面链接的时候能够找到对应的实现也就说到链接阶段时.c文件已经变成了.o文件。因此我们可以认为我们的静态库里内容也应该为.o再被封装。 静态库设计命令ar -rc libxxxx.a xxx.o 当我们有了库接下来就要将库引入我们的项目必须让编译器找到头文件和库文件 第三方库的使用 ①需要指定的头文件和库文件 ②如果没有默认安装到系统gcc、g默认的搜索路径下用户必须指明对应的选项来告诉编译器:a.头文件在哪 b.库文件在哪 c.库文件具体是谁 ③将我们下载下来的库和头文件拷贝到系统默认路径下——linux下安装库对任何软件而言安装和卸载的本质就是拷贝到系统特定的路径下 ④如果我们安装的库是第三方的除语言、操作系统接口库我们要正常使用即便是已经全部安装到了系统中g/gcc必须要用-l指明具体库的名称 理解现象 无论你是从网络中直接下好的库或者是源代码编译方法——make install 安装的命令——cp,安装到系统中我们安装大部分指令、库等都需要sudo或root操作
2.3动态库
在形成动态库时我们的.o文件不能再是普通的二进制而是与位置无关码 上图是生成动态库的命令 可是为什么生成了可执行程序执行不了呢这是因为仅仅是把动态库告诉了编译器并没有告诉OS。OS运行的时候因为.so并没有在系统的默认路径下所以OS找不到。而静态库的链接原则是将用户使用的二进制代码直接拷贝到目标可执行程序中而动态库不会
2.4动态库的配置
①环境变量LD_LIBRARY_PATH临时方案 ②软链接 ③配置文件方案 2.5动态库的理解
静态链接形成的可执行程序本身就有静态库中对应的方法实现但是静态链接非常占用资源磁盘、可执行程序体积变大、加载占用内存、下载周期变长、占用网络资源 其中我们要先明白代码数据本身就是在物理内存上的之后在通过映射到虚拟地址空间 我们的可执行程序中的并没有函数的实现只有函数的地址就如上图的例子进程A中有一个add函数他只有一个地址当运行进程A时创建task_struct并且有了虚拟地址空间此时进程A中由于使用了math这个动态库因此把add函数加载到内存中并映射到内存映射区共享区当我们把库加载到内存映射到进程的地址空间后我们的代码执行库中的方法就依旧还是在自己的地址空间内进行了函数跳转。 但是我们这样做必定会遇到一个问题不同的进程运行程度不同当加载好几个进程需要使用的第三方库是不同的注定了每一个进程的共享空间中空闲位置是不确定的。因此地址分为绝对编址和相对编址动态库中的所有编址都是偏移量默认从0地址开始。当一个库真正的被映射进地址空间的时候它的起始地址才能真正确定所谓之前提到的于位置无关码其实就是动态库中地址都是偏移量 补充①动态库和静态库同时存在系统默认采用动态链接 ②编译器在链接的时候如果提供的库既有动又有静优先动只有静没法只能静态链接 基础IO三的知识大概就讲到这里啦博主后续会继续更新更多Linux的相关知识干货满满如果觉得博主写的还不错的话希望各位小伙伴不要吝啬手中的三连哦你们的支持是博主坚持创作的动力