Linux——动态库
- gcc 指令生成动态库
- 动态库的使用
- 动态库与静态库区别
- 直接装到系统中
- 软连接
- LD_LIBRARY_PATH
- 直接修改动态库的配置文件
上一次我们了解了静态库,这次我们来了解动态库,如果还有没看过上一篇静态库的小伙伴,可以点击这里:
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优先动态链接,使用动态库。实在没有办法才采用静态库。