Linux——动态库

上一次我们了解了静态库,这次我们来了解动态库,如果还有没看过上一篇静态库的小伙伴,可以点击这里:

https://blog.csdn.net/qq_67693066/article/details/136271201

gcc 指令生成动态库

我们之前ar指令可以生成静态库,但是动态库我们可以直接用gcc直接形成:
在这里插入图片描述

我们运行一下:
在这里插入图片描述
我们看看mymath_lib的结构:
在这里插入图片描述
我们把mymath_lib移到Test_2的目录下:
在这里插入图片描述

动态库的使用

动态库的使用其实和静态库差不多:
在这里插入图片描述
但是运行a.out时:
在这里插入图片描述
报错了,这是为啥呢?我们可以用指令看看a.out执行时需要的文件路径:
在这里插入图片描述

动态库与静态库区别

这时候,大家肯定有很多疑问,我们一个个来:
静态库之所以不会报错,是因为静态库在编译时会被直接嵌入到可执行文件中,因此在运行时不需要外部的共享库文件
在这里插入图片描述
但是动态库不一样:动态库在运行时被动态地加载到内存中,并且动态库的加载依赖于系统的共享库路径(usr/lib/)
在这里插入图片描述
这样可以解释,为什么我们告诉编译器路径,但还是找不到的问题。所以有了对应的解决方法:

直接装到系统中

这种方法简单粗暴,找不到是吧?直接装在系统中:
在这里插入图片描述
我们可以找找看:
在这里插入图片描述
这个时候,我们再来执行a.out:
在这里插入图片描述
我们用ldd查看路径:
在这里插入图片描述
发现之前空的路径有了。

软连接

我们先把之前我们写的头文件和库从系统里面删除:
在这里插入图片描述
这个时候,再用ldd:
在这里插入图片描述

这个时候,我们可以创建软连接(因为软连接就是储存的是路径):
在这里插入图片描述
这个时候我们再来试试:
在这里插入图片描述
我们再用ldd指令看看:
在这里插入图片描述
发现有了路径,但是,这个只能在当前文件夹使用,一旦跳出本地,就会失去效果。

所以,我们得创建一个完整的路径,然后放在lib64下:
在这里插入图片描述
我们运行一下:
在这里插入图片描述
我们看一下路径和软连接
在这里插入图片描述

LD_LIBRARY_PATH

LD_LIBRARY_PATH 是一个环境变量,用于指定动态链接器在运行时查找共享库的路径。在类Unix系统中(如Linux),动态链接器会根据这个环境变量中指定的路径来搜索共享库文件。这个环境变量通常用于临时指定额外的共享库路径,以便程序能够找到需要的共享库文件。
当运行一个依赖于共享库的可执行文件时,操作系统会使用动态链接器(通常是 ld.so 或 ld-linux.so)来加载程序所需的共享库。动态链接器会按照一定的顺序搜索共享库文件,其中就包括 LD_LIBRARY_PATH 环境变量中指定的路径。
如果共享库文件位于非标准的路径下,或者希望优先使用特定路径下的共享库,您可以通过设置 LD_LIBRARY_PATH 环境变量来告诉动态链接器在哪里查找共享库文件。

我们可以打印出来看看:
在这里插入图片描述
我们在这个的基础之上,可以库的路径添加到这里面去:
在这里插入图片描述

直接修改动态库的配置文件

上面的全局变量的方法如果重启,就会失效,还有其他方法吗?
其实我们有一个关于动态库的配置文件:/etc/ld.so.conf.d
在这里插入图片描述
我们可以打印其中的一条:
在这里插入图片描述
我们可以看到这里面放的是路径,那么我们可以创建一个文件,里面放路径:
我们创建一个My_Math.conf文件:
在这里插入图片描述
然后放入我们的路径:
在这里插入图片描述
然后我们再来看一下:
在这里插入图片描述
如果不行,我们执行ldconfig命令。重新配置:
在这里插入图片描述

这里注意一下,一般来说,gcc优先动态链接,使用动态库。实在没有办法才采用静态库。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值