【linux--->动态库和静态库】


一、语言中的库

对于库的接触,其实在接触语言的时候就已将开始了,库分为两种,以.so为后缀的是动态库,以.a为后缀的是静态库;头文件和库是组合使用的,系统也有对应的库头文件的安装路径:/usr/lib64/和/usr/include/

1.库的查看

库文件查看路径
在这里插入图片描述
头文件查看路径
在这里插入图片描述

2.环境安装的本质

环境安装的本质,就是安装配套的头文件和库以及编译器,将头文件和库拷贝到系统指定的路径下。
另外扩充一点环境开发工具的知识,想vs2019或者是vim等这样的工具在编写代码的时候都有语法提醒功能,其原理是编译器把用户输入的语句拿过来,通过在头文件不断的对比搜索后再把匹配的结果展现出来。语法检查功能,是编译器的不断检查报错的结果。

3.库的作用

C语言中最常使用的函数就是printf()、scanf()等这样的输入输出函数,这些函数如果每个程序员在需要的时候都要自己去写,那么开发效率将会非常低下。这些库就相当于造好的轮子,使用的时候直接拿过来复用就行了。头文件和库是组合使用的,头文件提供说明,库提供实现方法,头文件是在预处理阶段使用的,链接的本质就是链接库。

二、库的制作与使用

1.库名的命名规则

以“libc-2.17.so”为例,其中lib是库的前缀,.so是库的后缀,真正的库名是c-2.17在命名的时候需要将前缀和后缀都加上,使用的时候要去掉前缀和后缀。

2.准备工作

2.1建立创建者和使用者文件夹

在这里插入图片描述

2.2在creat创建头文件和源文件

add.h

#pragma once
int add(int x,int y);

add.c

#include"add.h"
int add(int x,int y)
{
	return x+y;
}

sub.h

#pragma once
int sub(int x,int y);

sub.c

#include"sub.h"
int sub(int x,int y)
{
	return x-y;
}

2.3将头文件打包到include目录

在这里插入图片描述

3.静态库的制作与使用

将源文件生成目标文件
在这里插入图片描述
将目标打包成库放到lib目录
在这里插入图片描述
我们自己制作的库属于是第三方库,即不属于C语言的库,gcc本身是C语言的编译器,所以需要告诉gcc用户需要连接那个库,C语言的库和头文件都是在gcc默认的搜索路径下的,include和lib没有在默认搜索路径下,所以需要告诉gcc头文件和库的在什么地方。
在这里插入图片描述
也可以将include和lib拷贝到/urs/lib64/和/usr/include/下
在这里插入图片描述

4.动态库的制作和使用

将源文件打包成动态库放在lib目录中,生成动态库的时候必须将头文件和源文件放在一起,不然会出错,生成动态库的前提是生成与位置无关码Position-independent code。
在这里插入图片描述在这里插入图片描述

动态库路径设置法

在这里插入图片描述
动态库比静态库要特殊一点,它不光在链接的时候需要将头文件和库的位置告诉编译器,在可执行文件执行的时候,操作系统还要再用到动态库,所以还要再把库的路径告诉操作系统。有三种方法可以设置路径。

1.配置LD_LIBRARY_PATH环境变量法

将动态库的路径添加到环境变量中就可以了,这个环境变量是临时环境变量,重新启动bash将失效
在这里插入图片描述

2.软连接法

将动态库的文件创建一个软链接,将软链接放在/usr/lib目录下
在这里插入图片描述

3.文件配置法

在/etc/ld.so.conf.d目录下创建一个以.conf为后缀的配置文件,然后动态库的路径写到文件中,使用ldconfig命令使文件生效即可,注意不管是创建文件还是使用ldconfig命令都要用sudo命令
在这里插入图片描述
在这里插入图片描述

三、库的使用原理

1.静态库的使用原理

静态库在链接的时候是将用户使用的方法代码拷贝到执行文件中去的,也就是说只要生成可执行文件,就算删除静态库程序也照样可以运行,但是使用静态库可能会造成代码膨胀。静态库采用的是绝对编址的方式,在生成可执行的时候就已经对文件做好了编址,按照从全0到全f的方式进行编址,加载到内存的时候只需要按照地址一条一条的执行即可。
在这里插入图片描述

2.动态库的使用原理

2.1与位置无关码

动态库与静态库不同的是,动态库并不是将库方法在链接的时候直接拷贝到可执行文件中去的,而是可执行文件在执行的时候遇到库方法调用时,由操作系统找到动态库文件,然后将它加载到物理内存中,再由页表映射到进程地址空间的共享区中,这个时候动态库的起始地址才是确定的,通过动态库起始地址加上库方法在库中的存储位置,也就是偏移量来访问库函数。两个进程公用一个动态库的时候是不需要重复加载的,只需要将物理内存中的库映射到另一个进程中去即可。每个进程的执行速度是不一样的,而且不同进程所需要链接的动态库数量也不一样,所以动态库在不同进程地址空间共享区中的位置也可能不一样。动态库文件中存储的地址都是偏移量,偏移量默认从0开始,所以与位置无关码,就是动态库的偏移量。

2.2文件执行过程

可执行文件执行到动态库方法,操作系统找到并加载动态库到物理内存,物理内存映射到进程mm_struct共享区,然后cpu从代码区跳转到共享区找到库函数并执行,然后再跳转到代码区接着执行下一条语句。
在这里插入图片描述

3.需注意的点

动态库如果删除那么可执行文件就不能执行了;当动态的库和静态库都有的时候,编译器会优先使用动态库,如果只有静态库那就只能使用静态库。一般云服务器是不安装静态库的需要自己手动安装,安装命令sudo yum -install -y glibc-static。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值